API:An activity is a single, focused thing that the user can do.
译:一个活动是一个单独的个体,负责处理用户做的事件。(大概就是这个意思,汗,这个还真不好翻译,呵呵。)
下面这张是官方给出的Activity的生命周期图:
从这张图中,我们可以看出5条路线:
1、onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy....
2、onCreate -> onStart -> onResume -> onPause -> App process killed -> onCreate....
3、onCreate -> onStart -> onResume -> onPause -> onStop -> App process killed -> onCreate....
4、onCreate -> onStart -> onResume -> onPause -> onResume....
5、onCreate -> onStart -> onResume -> onPause -> onStop -> onRestart -> onStart....
那么这些路线是什么意思呢?下面我们来仔细阅读下。(在本文最后会上传一个DEMO,结合DEMO看会更加清晰.)
在前文中我们谈到了Android进程,在这里可以结合起来,下面我们来一一分析上面的5条路线:
1、当一个Activity启动的时候,系统会调用他的onCreate,onStart,onResume方法,这时候,Activity处于可以和用户交互的状态,当然,也就是说现在Activity是位于前台进程,这时候,如果用户按下了Back键退出了App,那么,系统会依次调用Activity的onPause,onStop,onDestroy方法,这时候Activity就变成了空进程。
2、前面的同上,我们来看onPause方法执行后,这时,我们的Activity还是处于可见状态,他处于可见进程级别,但是,用户现在不能与他直接交互,如果系统资源不够了,那么,我们的App很可能被杀死,然后,当我们回到Activity的时候,系统会调用Activity的onCreate,onStart,onResume方法,来重新生成一个Acitivity。
3、前面的同上,当Activity执行到onStop的时候,也就是说,我们按下了Home键,这时候,Activity的进程处于后台进程,后台进程的优先级仅略高于空进程,当系统资源不足的时候,就会被系统杀死,然后,当我们重新回到App的时候,系统又会调用Activity的onCreate,onStart,onResume方法,来重新生成一个Acitivity。
4、这种情况类似上面的第二种情况,只是从这种情况看来,系统资源还比较充足,不用去杀死这个可见进程,然后,当我们重新回到主Activity的时候,系统就会调用Activity的onResume方法,让他又处于前台进程级别。
5、这种情况类似上面的第三中情况,当我们按下Home键后,又重新返回到Activity中,当然,这时候,系统资源还是比较富裕,还不至于去杀掉他,所以,我们的Activity从后台进程级别又回到了前台进程级别。
下面是测试截图:
test_1: 运行程序打印的日志;
test_2: 点击"测试OnPause状态"打印的日志;
test_3: 取消弹窗后打印的日志;
test_4: 按下手机Home键后,打印的日志;
test_5: 重新返回Activity后打印的日志;
test_6: 旋转手机屏幕后,打印的日志;
test_7: 按下退出键后打印的日志;
test_8: 手机内存不足时打印的日志???
(暂时没想到方案测试该种情况,不过大致可以预测出来)其实各大生命周期有其特别的存在,只要动动手测试下,在项目中某些特定的场合就能派上大用场; 比如:
onSaveInstanceState状态从以上测试截图得知其运行条件有2种:1,按下Home键;2,手机屏幕旋转;
onRestoreInstanceState状态则只会在手机屏幕旋转后才会执行一次;
onPause状态则与onResume状态对应存在,也就是说只要离开当前页面或程序, onPause状态就会执行, 而当回到当前页面,则onResumu状态就会执行;假设现在需要你判断手机屏幕是否旋转,然后进行对应的操作, 那么这个时候就有2种方案可执行:1,在onRestoreInstanceState设置个falg当onRestoreInstanceState执行时,我们就可以知道;2,利用onSaveInstanceState和onDestroy状态设置flag,我们也可以得知,因为按下Home键时onSaveInstanceState才会被调用一次,但是按下Home键时不会执行onDestroy方案;还有onPause 和 onResume用得是比较多的了,还记得友盟统计吗,哈哈,现在应该知道友盟统计为什么让我们在onPause和onResume中加方法了吧,这就是统计时长的原理了.
(注:本篇博客写得比较早了,最近心血来潮上来补充点东西.下面的DEMO就没加上onSaveInstanceState,onRestoreInstanceState,onWindowFocusChanged 3个方法,自行加上就好了测试下,加深印象.)
下面我们新建一个名为TestActivityCycleLife的工程,让我们来看看他的执行效果,代码如下:
首先是我们的TestActivityCycleLife的Java代码:
package com.testactivitycyclelife;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.app.Activity;
import android.content.Intent;
public class TestActivityCycleLife extends Activity {
private static final String TAG = "TestActivityCycleLife";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_activity_cycle_life);
this.findViewById(R.id.testOnPause).setOnClickListener(mClick);
Log.e(TAG, "onCreate is executing!");
}
//TextView的点击事件监听,为了测试执行onPause的情况
private OnClickListener mClick = new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(TestActivityCycleLife.this, TestOnPause.class);
startActivity(intent);
}
};
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart is executing!");
}
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume is executing!");
}
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause is executing!");
}
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart is executing!");
}
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop is executing!");
}
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy is executing!");
}
}
接着是TestActivityCycleLife的布局文件名为test_activity_cycle_life.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".TestActivityCycleLife" >
<TextView
android:id="@+id/testOnPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/test_onPause"
android:textSize="20sp" />
</RelativeLayout>
下面为了单独测试onPause方法所写的Activity名为TestOnPause:
package com.testactivitycyclelife;
import android.app.Activity;
import android.os.Bundle;
public class TestOnPause extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_onpause);
}
}
接着是TestOnPause的布局文件名为test_onpause.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000ff" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/app_name"
android:textSize="18sp" />
</RelativeLayout>
最后是我们最重要的Manifest文件的代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testactivitycyclelife"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.testactivitycyclelife.TestActivityCycleLife"
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.testactivitycyclelife.TestOnPause"
android:label="@string/app_name"
android:theme="@android:style/Theme.Dialog">
<!-- 上面这句是使得Activity以Dialog的形式显示,为了实现onPause方法单独执行 -->
</activity>
</application>
</manifest>
测试生命周期DEMO链接:TestActivityCycleLife
推荐同类文章: 基础总结篇之一:Activity生命周期 两分钟彻底让你明白Android Activity生命周期(图文)!