android开发不能不知activity生命周期,理解Activity的生命周期对应用程序开发来说是至关重要的,这样才能确保您的应用提供了一个很好的用户体验和妥善管理其资源。
Activity状态
随着Activity的创建和销毁,也就会进出栈如上图所示,其中可能会经历以下四种状态:
- Active状态:这时候Activity处于栈顶,且是可见的,有焦点的,能够接收用户输入前景Activity。OPhone Runtime将试图不惜一切代价保持它活着,甚至杀死其他Activity以确保它有它所需的资源。当另一个Activity变成Active时,当前的将变成Paused状态。
- Paused状态:在某些情况下,你的Activity是可见的,但没有焦点,在这时候,Actvity处于Paused状态。例如,如果有一个透明或非全屏幕上的Activity在你的Actvity上面,你的 Activity将。当处于Paused状态时,该Actvity仍被认为是Active的,但是它不接受用户输入事件。在极端情况下,OPhone Runtime将杀死Paused Activity,以进一步回收资源。当一个Actvity完全被遮住时,它将进入Stopped状态。
- Stopped 状态:当Activity是不可见的时,Activity处于Stopped状态。Activity将继续保留在内存中保持当前的所有状态和成员信息,假设系统别的地方需要内存的话,这时它是被回收对象的主要候选。当Activity处于Stopped状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
- Inactive状态:Activity被杀掉以后或者被启动以前,处于Inactive状态。这时Activity已被移除从Activity堆栈中,需要重新启动才可以显示和使用。
下面再通过一个比喻来看两个Activity的切换过程。
我们把Activity比作一本书,我们要看书,首先从书架上取出书(onCreate),然后放到桌上(onStart),接着打开书(onResume),这样我们就可以看书并可以在书本上写字了。
如果这时候我们要启动另一个Activity,也就是要看另一本书,首先我们放下手中的笔或者说合上书(onPause),然后从书架上拿下另一本书(书2:onCreate),然后把书本2放到桌上并打开(书2:onStart、onResume)。
如果书本1被书本2完全盖住了,即不可见了,就调用书本1的onStop;而如果书本2较小,没有完全盖住书本1,则不会调用。
我们还可以把书本1放回书架上,即onDestroy。
另外,还有一点要注意,Activity在处于onPause、onStop、onDestroy状态下,系统都可以销毁该Activity所在进程,所以我们在处理一些要保存的数据时,必须在onPause方法中进行,因为onStop和onDestroy方法不一定会被调用。
一、设计界面
1、MainActivity布局文件
打开res/layout/activity_main.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" >
<Button
android:id="@+id/open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打开OtherActivity" />
</LinearLayout>
2、OtherActivity布局文件
打开res/layout/activity_other.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" >
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回MainActivity" />
</LinearLayout>
二、程序文件
1、MainActivity.java
打开“src/com.genwoxue.activitylifecycle/MainActivity.java”文件。
然后输入以下代码:
package com.genwoxue.activitylifecycle;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
private Button btnOpen=null;
//当Activity程序启动之后,首先调用onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("[M]MainActivity:onCreate()执行");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOpen=(Button)super.findViewById(R.id.open);
btnOpen.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
System.out.println("[M]MainActivity程序执行");
Intent intent=new Intent(MainActivity.this,OtherActivity.class);
MainActivity.this.startActivity(intent);
}
});
}
//当为用户第一次显示界面时调用onCreate()
@Override
protected void onStart(){
System.out.println("[M]MainActivity:onStart()执行");
super.onStart();
}
//当攻得用户焦点时调用onResume()
@Override
protected void onResume(){
System.out.println("[M]MainActivity:onResume()执行");
super.onResume();
}
//当启动其他Activity程序时调用此方法,用于进行数据的提交、动画处理等操作。
@Override
protected void onPause(){
System.out.println("[M]MainActivity:onPause()执行");
super.onPause();
}
//当一个Activity程序完全不可时调用onStop(),此时并不会销毁Activity程序。
@Override
protected void onStop(){
System.out.println("[M]MainActivity:onStop()执行");
super.onStop();
}
//Activity程序停止后再次显示给用户时onRestart()
@Override
protected void onRestart(){
System.out.println("[M]MainActivity:onRestart执行");
super.onRestart();
}
//程序被销毁时调用onDestroy():当调用finish()方法或系统资源不够用时将调用此方法。
@Override
protected void onDestroy(){
System.out.println("[M]MainActivity:onDestroy执行");
super.onDestroy();
}
}
2、OtherActivity.java
打开“src/com.genwoxue.activitylifecycle/OtherActivity.java”文件。
然后输入以下代码:
package com.genwoxue.activitylifecycle;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.Intent;
public class OtherActivity extends Activity {
private Button btnBack=null;
//当Activity程序启动之后,首先调用onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("[O]OtherActivity:onCreate()执行");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
btnBack=(Button)super.findViewById(R.id.back);
btnBack.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view){
System.out.println("[O]OtherActivity程序执行");
Intent intent=new Intent(OtherActivity.this,MainActivity.class);
OtherActivity.this.startActivity(intent);
}
});
}
//当为用户第一次显示界面时调用onCreate()
@Override
protected void onStart(){
System.out.println("[O]OtherActivity:onStart()执行");
super.onStart();
}
//当攻得用户焦点时调用onResume()
@Override
protected void onResume(){
System.out.println("[O]OtherActivity:onResume()执行");
super.onResume();
}
//当启动其他Activity程序时调用此方法,用于进行数据的提交、动画处理等操作。
@Override
protected void onPause(){
System.out.println("[O]OtherActivity:onPause()执行");
super.onPause();
}
//当一个Activity程序完全不可时调用onStop(),此时并不会销毁Activity程序。
@Override
protected void onStop(){
System.out.println("[O]OtherActivity:onStop()执行");
super.onStop();
}
//Activity程序停止后再次显示给用户时onRestart()
@Override
protected void onRestart(){
System.out.println("[O]OtherActivity:onRestart执行");
super.onRestart();
}
//程序被销毁时调用onDestroy():当调用finish()方法或系统资源不够用时将调用此方法。
@Override
protected void onDestroy(){
System.out.println("[O]OtherActivity:onDestroy执行");
super.onDestroy();
}
}
三、配置文件
打开“AndroidManifest.xml”文件。
然后输入以下代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.genwoxue.activitylifecycle"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.genwoxue.activitylifecycle.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>
<activity
android:name="com.genwoxue.activitylifecycle.OtherActivity"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
注意:多Activity需要在AndroidManifest.xml文件中添加以下代码:
<activity
android:name="com.genwoxue.activitylifecycle.OtherActivity"
android:label="@string/app_name" >
</activity>
四、运行结果
1、第一种情况:运行ActivityLifeCycle—>按“Back”返回键:
(1)第一步,创建message过滤器
单击“+”号按钮,并在Logcat Message Filter Settings进行如下设置;
(2)第二步,选中LogCat中的“Main”。
(3)第三步,运行主Activity;之后再按“Back”手机返回键。
我们认真观察(结合Activity生命周期图):
A、第一次运行ActivityLifecycle程序:onPause()、onStop()、onDestroy()执行(上图红色背景部分,图示①)
B、按下“Back”键:onPause()、onStop()、onDestroy()执行(上图蓝色背景部分,图示②)
至此,完成了一个完整的生命周期。
2、第二种情况:运行ActivityLifeCycle—>按“Home”键—>再次激活ActivityLifeCycle
(1)第一步,选中LogCat中的“Main”。
(2)第二步,运行主Activity;之后再按“Home”键;之后再激活ActivityLifeCycle。
我们认真观察(结合Activity生命周期图):
A、第一次运行ActivityLifecycle程序:onPause()、onStop()、onDestroy()执行(上图红色背景部分,图示①)
B、按下“Home”键:onPause()、onStop()(上图绿色背景部分,图示②)(注意虽然ActivityLifecycle不可见了,但onDestroy()并没有执行,这意味着还有机会重新回到前台执行)
C、再次激活ActivityLifecycle程序:onRestart()、onStart()、onResume()执行(上图蓝色背景部分,图示③)(注意激活和第一次运行区别,第一次运行执行了onCreate(),而激活则是onRestart())
至此,重新进入到正常的运行状态。
以上两种情况实际上仅仅执行了ActivityLifecycle应用程序中的MainActivity,下面我们学习多个Activity进行交互的生命周期。
3、第三种情况:运行ActivityLifeCycle之MainActivity—>单击“打开OtherActivity”按钮—>单击“返回MainActivity”
(1)第一步,创建message过滤器
单击“+”号按钮,并在Logcat Message Filter Settings进行如下设置;
(2)第二步,运行MainActivity;再单击“打开OtherActivity”;再单击“返回MainActivity”。
我们认真观察(结合Activity生命周期图):
A、第一次运行MainActivity:[M]MainActivity之onPause()、onStop()、onDestroy()执行(上图红色背景部分,图示①)
B、单击“打开OtherActivity”按钮:(上图绿色背景部分,图示②)
从MianActivity到OtherActivity过程中,我们看到:
Ⅰ、MainActivity从运行状态,到onPause();
Ⅱ、紧接着[O]OtherActivity执行了onCreate()、onStart()、onResume(),也就意味着此时,OtherActivity接管,其进入了正常的运行态;
Ⅲ、之后MainActivity执行了onStop()状态。
C、单击“返回MainActivity”按钮:(上图蓝色背景部分,图示③)
从OtherActivity再到MianActivity过程中,我们看到:
Ⅰ、OtherActivity从运行状态,到onPause();
Ⅱ、紧接着[M]MainActiviy执行了onCreate()、onStart()、onResume(),也就意味着此时,MainActivity接管,其进入了正常的运行态;
Ⅲ、之后OtherActivity执行了onStop()状态。
以上为多个Activity切换,其生命周期过程。