Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。
Activity作为四大组件之一,其生命周期也就是它所在的进程的生命周期。Activity生命周期需要深入理解,后续的开发和调试都会使用到。
一、 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
下图是一张经典的Activity生命周期流程图
1、onCreate()当第一次调用一个Activity就会执行
2、onStart()表示当前的Activity处于可见状态
3、onResume()表示当Activity可以得到用户焦点
4、onPause()表示当前Activity被遮挡,即失去用户焦点
5、onStop()表示当前Activity不可见
6、 onDestory()表示当前的activity被销毁
7、 当Activity没有被销毁的时候重新调用这个Activity就会调用onRestart方法
根据官方给出的说明,可以清楚的知道,在什么状态下,应该处理那些事件。即那些事件放在哪个状态下处理是合适的。
二、为了加深对Activity生命周期的认知,需要看下在多个Activity的时候,对应的生命周期的信息。
例如,我们在第一个Activity里面,通过点击button按钮来启动第二个Activity。
package com.android.activity.demo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends Activity implements View.OnClickListener {
private static final String TAG = "FirstActivity";
private Button mButton1 = null;
private Button mButton2 = null;
private Button mButton3 = null;
private Button mButton4 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XLog.i(TAG, "onCreate()");
setContentView(R.layout.activity_first);
findView();
setListener();
}
private void findView() {
mButton1 = (Button) findViewById(R.id.btn_start_second_activity01);
mButton2 = (Button) findViewById(R.id.btn_start_second_activity02);
mButton3 = (Button) findViewById(R.id.btn_start_second_activity03);
mButton4 = (Button) findViewById(R.id.btn_start_second_activity04);
}
private void setListener() {
mButton1.setOnClickListener(this);
mButton2.setOnClickListener(this);
mButton3.setOnClickListener(this);
mButton4.setOnClickListener(this);
}
@Override
protected void onRestart() {
super.onRestart();
XLog.i(TAG, "onRestart()");
}
@Override
protected void onStart() {
super.onStart();
XLog.i(TAG, "onStart()");
}
@Override
protected void onResume() {
super.onResume();
XLog.i(TAG, "onResume()");
}
@Override
protected void onPause() {
super.onPause();
XLog.i(TAG, "onPause()");
}
@Override
protected void onStop() {
super.onStop();
XLog.i(TAG, "onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
XLog.i(TAG, "onDestroy()");
}
@Override
public void onClick(View view) {
int id = view.getId();
XLog.i(TAG, "onClick() id = 0x" + Integer.toHexString(id));
switch (id) {
case R.id.btn_start_second_activity01: {
startSecondActivityByAction();
break;
}
case R.id.btn_start_second_activity02: {
startSecondActivityByClass();
break;
}
case R.id.btn_start_second_activity03: {
startSecondActivityByPackage();
break;
}
case R.id.btn_start_second_activity04: {
startSecondActivityByComponent();
break;
}
default:
break;
}
}
private void startSecondActivityByAction() {
XLog.i(TAG, "startSecondActivityByAction()");
Intent intent = new Intent();
intent.setAction("android.intent.action.SECONDACTIVITY_START");
intent.addCategory(Intent.CATEGORY_DEFAULT);
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}
private void startSecondActivityByClass() {
XLog.i(TAG, "startSecondActivityByClass()");
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}
private void startSecondActivityByPackage() {
XLog.i(TAG, "startSecondActivityByPackage()");
Intent intent = new Intent();
intent.setClassName(getPackageName(), getPackageName() + ".SecondActivity");
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}
private void startSecondActivityByComponent() {
XLog.i(TAG, "startSecondActivityByComponent()");
Intent intent = new Intent();
intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".SecondActivity"));
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}
}
第二个Activity的部分
package com.android.activity.demo;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XLog.i(TAG, "onCreate()");
setContentView(R.layout.activity_second);
}
@Override
protected void onRestart() {
super.onRestart();
XLog.i(TAG, "onRestart()");
}
@Override
protected void onStart() {
super.onStart();
XLog.i(TAG, "onStart()");
}
@Override
protected void onResume() {
super.onResume();
XLog.i(TAG, "onResume()");
}
@Override
protected void onPause() {
super.onPause();
XLog.i(TAG, "onPause()");
}
@Override
protected void onStop() {
super.onStop();
XLog.i(TAG, "onStop()");
}
@Override
protected void onDestroy() {
super.onDestroy();
XLog.i(TAG, "onDestroy()");
}
}
1、当我们启动一个Activity的时候,输出的log如下
03-17 09:02:21.766: I/ActivityDemo(12870): FirstActivity onCreate()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onResume()
可以看到,分别先后调用了 onCreate() onStart() onResume()
2、当我们按返回键退出第一个应用的时候,输出log如下
03-17 09:04:01.624: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onStop()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onDestroy()
退出应用的时候,分别先后调用了onPause() OnStop() onDestroy()
03-17 09:05:36.637: I/ActivityDemo(12870): FirstActivity onClick() id = 0x7f060002
03-17 09:05:36.638: I/ActivityDemo(12870): FirstActivity startSecondActivityByAction()
03-17 09:05:36.765: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:05:36.777: I/ActivityDemo(12870): SecondActivity onCreate()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onStart()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onResume()
03-17 09:05:37.222: I/ActivityDemo(12870): FirstActivity onStop()
启动到第二个Activity的时候,先是第一个应用的onPause(),失去焦点,被压到后台。
第二个应用的onCreate(创建) onStart(可见) onResume(可以获取焦点)。
当第二个应用onResume()可以获取焦点的时候,在把第一个应用onStop()不可见
4、从第二个应用返回第一个应用,输出log如下:
03-17 09:07:03.518: I/ActivityDemo(12870): SecondActivity onPause()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onRestart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onResume()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onStop()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onDestroy()
先是第二个应用的onPause,失去焦点。
第一个应用被重新唤醒 onRestart, onStart可见,onResume可以获取焦点
然后才是第二个应用的onStop不可见,被销毁ondestory
附件:Demo对应的Sorce Code