Android组件之Activity讲解

来源:互联网 发布:php b2b2c商城系统 编辑:程序博客网 时间:2024/05/06 22:27

       在Android系统中activity提供可视化的用户界面,一个Android应用通常由多个activity组成。多个activity组成了Activity栈,当前活动的Activity处于栈顶。Activity有自己的生命周期,由Android系统来控制。

       1、Activity状态
  一般认为Activity有以下四种状态:
  活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。
  暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏,它将会变成停止。
  停止:当一个Activity不是可视的,它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了,它将变为待用状态。

       销毁:被系统或进程结束。

       2、Activity的创建

       创建一个Activity界面一般是继承Activity类(当然也可以继承ListActivity、MapActivity等),覆盖Activity类的onCreate方法,在该方法中调用setContentView()方法展示要显示的视图,然后调用findViewById()方法实例化组件。注意的是必须在AndroidManifest.xml清单文件中声明Activity名称才能使用。

      下面代码演示了在MainActivity中添加LinearLayout布局视图,在该视图中添加一个按钮和一个文本框,覆盖Activity的onCreate()方法,在该方法中调用setContentView()方法展示要显示的视图,并调用findViewById()方法实例化组件。

public class MainActivity extends Activity {private static final String TAG = "lifecycle";private Button btnButton;private TextView tvtitle;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.main);//通过findViewById方法获得Button实例tvtitle = (TextView) findViewById(R.id.btnButton);//通过findViewById方法获得Button实例btnButton = (Button) findViewById(R.id.btnButton);}}
       布局文件代码如下所示:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView         android:id="@+id/tvtitle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="简单的Activity创建"        />    <Button         android:id="@+id/btnButton"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="按钮"/></LinearLayout>
       Manifest.xml清单文件代码如下:

 <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <!-- 声明Activity -->        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>
       运行结果如下:


      3、启动另一个Activity

       像我们做Web开发一样,经常会从一个页面跳转到另一个页面。在Android中我们也经常会从一个Activity跳转到另一个Activity做出一些处理。从一个Activity启动另一个Activity可以使用startActivity方法或者startActivityForResult()方法。这两个方法要传递的参数是Android中的另外一个非常重要的组件Intent,Intent是相同或不同组件间的信使。

      下面代码有两个Activity:FirstActivity和SecondActivity。每个Activity中放置一个按钮,FirstActivity中的按钮响应事件跳转到SecondActivity,SecondActivity中的按钮响应事件跳转到FirstActivity。

//FirstActivity.javapublic class FirstActivity extends Activity {private Button btnButton;private TextView tvtitle;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.main);//通过findViewById方法获得Button实例tvtitle = (TextView) findViewById(R.id.tvtitle);//通过findViewById方法获得Button实例btnButton = (Button) findViewById(R.id.btnButton);tvtitle.setText("这是FirstActivity");btnButton.setText("切换到SecondActivity");btnButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {//显示方式声明Intent,直接启动SecondActivityIntent intent = new Intent(FirstActivity.this,SecondActivity.class);//启动ActivitystartActivity(intent);}});}}//SecondActivity.javapublic class SecondActivity extends Activity {private static final String TAG = "lifecycle";private Button btnButton;private TextView tvtitle;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.main);//通过findViewById方法获得Button实例tvtitle = (TextView) findViewById(R.id.tvtitle);//通过findViewById方法获得Button实例btnButton = (Button) findViewById(R.id.btnButton);tvtitle.setText("这是SecondtActivity");btnButton.setText("切换到FirstActivity");btnButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {//显示方式声明Intent,直接启动SecondActivityIntent intent = new Intent(SecondActivity.this,FirstActivity.class);//启动ActivitystartActivity(intent);}});}}
       Manifest.xml清单文件代码如下:

    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <!-- 声明FirstActivity -->        <activity            android:name=".FirstActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <!-- 声明SecondtActivity -->        <activity android:name=".SecondActivity"></activity>    </application>
       运行结果如下:

      4、Activity之间传递参数

      在Web开发中我们经常把数据放在某个Scope中(如request、session)来实现数据共享。在Android系统中不同的Activity之间又是如何传递数据呢?这里用到另外一个对象Bundle,我们将要传递的信息封装到该对象里,并通过Intent对象传递到另一个Activity中。

public class FirstActivity extends Activity {private Button btnButton;private EditText etUsername;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.first);//通过findViewById方法获得Button实例btnButton = (Button) findViewById(R.id.btnButton);//通过findViewById方法获得EditText实例etUsername = (EditText) findViewById(R.id.etusername);//设置Button点击监听器btnButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//获取姓名字符串String name = etUsername.getText().toString();//实例化Bundle对象Bundle data = new Bundle();//将姓名信息添加到Bundle对象中data.putString("name", name);//实例化Intent对象Intent intent = new Intent(FirstActivity.this,SecondActivity.class);//为Intent添加Bundleintent.putExtras(data);//启动第二个ActivitystartActivity(intent);}});}}<pre name="code" class="java">//SecondActivity.javapublic class SecondActivity extends Activity {private TextView tvResult;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.second);//通过findViewById方法获得TextView实例tvResult = (TextView) findViewById(R.id.tvresult);Map<String,String> map = new HashMap<String, String>();map.put("James", "123456");map.put("Jordan", "abcdef");map.put("Paul", "ABCDEF");boolean isFinded = false;//获得IntentIntent intent = getIntent();//从Intent中获得Bundle对象Bundle b = intent.getExtras();//从Bundle中获得nameString name = b.getString("name");//通过Map.entrySet遍历key和valuefor(Map.Entry<String, String> entry : map.entrySet()){if(entry.getKey().equals(name)){ isFinded = true; tvResult.setText("\n\n\nname:"+entry.getKey()+"-----------PassWordr:"+entry.getValue());break;}}if(isFinded == false){tvResult.setText("查找不到此人:"+name+"的信息");}}}

       运行结果如下:

      5、启动另一个Activity并返回结果

      有时候我们需要从第一个Activity启动第二个Activity,在第二个Activity中处理完一些业务后,需要将处理结果返回到第一个Activity中,那么,我们就需要在第一个Activity中使用startActivityForResult()方法启动第二个Activity。

      下面通过一个实例实现从第一个Activity中要求用户输入用户名称,将用户名称传递给第二个Activity。第二个Activity通过用户名称查询用户的密码,然后在第二个Activity中将密码返回给第一个Activity,并显示。

//FirstActivity.javapublic class FirstActivity extends Activity {public static final int FIRSTREQUESTCODE = 0;private Button btnButton;private EditText etUsername;private TextView tvResult;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.first);//通过findViewById方法获得Button实例btnButton = (Button) findViewById(R.id.btnButton);//通过findViewById方法获得EditText实例etUsername = (EditText) findViewById(R.id.etusername);//通过findViewById方法获得TextView实例tvResult = (TextView) findViewById(R.id.tvresult);//设置Button点击监听器btnButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//获取姓名字符串String name = etUsername.getText().toString();//实例化Bundle对象Bundle data = new Bundle();//将姓名信息添加到Bundle对象中data.putString("name", name);//实例化Intent对象Intent intent = new Intent(FirstActivity.this,SecondActivity.class);//为Intent添加Bundleintent.putExtras(data);//启动第二个ActivitystartActivityForResult(intent, FIRSTREQUESTCODE);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if(FirstActivity.FIRSTREQUESTCODE == resultCode){//从Intent中获得BundleBundle b = data.getExtras();//获得用户名和密码String username = b.getString("name");String password = b.getString("password");tvResult.setText("\n\n\n返回结果:name:"+username+"-----------PassWord:"+password);}}}//SecondActivity .javapublic class SecondActivity extends Activity {private TextView tvResult;private Button btnBack;private String userName;private String PassWord;//创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置当前Activity界面布局setContentView(R.layout.second);//通过findViewById方法获得TextView实例tvResult = (TextView) findViewById(R.id.tvresult);Map<String,String> map = new HashMap<String, String>();map.put("James", "123456");map.put("Jordan", "abcdef");map.put("Paul",    "ABCDEF");boolean isFinded = false;//获得IntentIntent intent = getIntent();//从Intent中获得Bundle对象Bundle b = intent.getExtras();//从Bundle中获得nameString name = b.getString("name");//通过Map.entrySet遍历key和valuefor(Map.Entry<String, String> entry : map.entrySet()){if(entry.getKey().equals(name)){ isFinded = true; tvResult.setText("\n\n\n查询结果:name:"+entry.getKey()+"-----------PassWord:"+entry.getValue()); userName = entry.getKey(); PassWord = entry.getValue();break;}}if(isFinded == false){tvResult.setText("查找不到此人:"+name+"的信息");} //通过findViewById方法获得Button实例btnBack = (Button) findViewById(R.id.btnButton);//设置Button点击监听器btnBack.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//获得IntentIntent intent = getIntent();//实例化Bundle对象Bundle data = new Bundle();//从Bundle中获得namedata.putString("name", userName);data.putString("password", PassWord);//为Intent添加Bundleintent.putExtras(data);//设置返回结果SecondActivity.this.setResult(FirstActivity.FIRSTREQUESTCODE, intent);//结束当前ActivitySecondActivity.this.finish();}});}}
       first.xml布局文件代码如下所示:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView         android:id="@+id/tvtitle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="这是FirstActivity"        />     <TextView         android:id="@+id/tvusername"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="请输入用户名:"        />     <EditText          android:id="@+id/etusername"        android:layout_width="fill_parent"        android:layout_height="wrap_content"         />         <Button         android:id="@+id/btnButton"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="查询"/>            <TextView         android:id="@+id/tvresult"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        /></LinearLayout>
      second.xml布局文件代码如下所示:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView         android:id="@+id/tvtitle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="这是SecondActivity"        />       <Button         android:id="@+id/btnButton"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="返回结果"/>              <TextView         android:id="@+id/tvresult"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        /></LinearLayout>
       运行结果如下:

0 0
原创粉丝点击