一:导读
Android应用程序由四大组件构成最基本的框架,分别是Activity,Service,BroadcastReceiver和Content Provider,而在组件和程序之间进行消息传递则使用Intent。同时,针对线程之间的信息传递也提出了自己的通信机制。其中,Activity是最重要也是使用频率最高的组件。一个Activity通常是一个单独的全屏显示界面,在其中有若干视图控件以及对应的事件处理。大部分应用程序都包含了多个Activity,当多个Activity相互跳转切换时,就形成一个Activity栈,以及Activity之间的数据交换。
二:Activity生命周期
(1.1)图解分析:
onCreate()方法:在创建Activity时被调用。该方法是最常见的方法,每个活动中我们都重写了这个方法。在Eclipse中创建Android项目时,会自动创建一个Activity,在该Activity中,默认重写了onCreate(Bundle savedInstanceState)方法,用于该Activity执行初始化。你应该在这个方法中完成活动的初始化操作,比如说加载布 局、绑定事件等
onStart()方法:这个方法在活动由不可见变为可见的时候调用。
onResume()方法:当Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity栈的栈顶,并且处于运行状态(可见状态)。
onPause()方法:暂停Activity时被回调,该方法需要被非常快速的执行,因为直到该方法执行完毕后,下一个Activity才能被恢复。在该方法中,通常用于持久保持数据:我们通常会在这个方 法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度 一定要快,不然会影响到新的栈顶活动的使用。例如,当我们正在玩游戏时,突然来了一个电话,这时就可以在该方法中将游戏状态持久保存起来。
onStop()方法:停止Activity时被回调,即在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如 果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。
onDestroy()方法:这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
onRestart()方法:这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。 以上七个方法中除了 onRestart()方法,其他都是两两相对的。
二:实例测试探究
下面做一个实例进行测试:创建两个Activity(MainActivity和ActivityTwo)分别重写上述方法。给MainActivity添加按钮并实现点击事件(跳转到ActivityTwo)。
MainActivity.java
package com.example.activitytest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button btnButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnButton = (Button)findViewById(R.id.btnButton);
btnButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this,ActivityTwo.class);
startActivity(intent);
}
});
Log.e("TAG", "MainActivity onCreate() method is executed");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.e("TAG", "MainActivity onStart() method is executed");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.e("TAG", "MainActivity onRestart() method is executed");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e("TAG", "MainActivity onPause() method is executed");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e("TAG", "MainActivity onResume() method is executed");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e("TAG", "MainActivity onStop() method is executed");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e("TAG", "MainActivity onDestroy() method is executed");
}
}
ActivityTwo.java
package com.example.activitytest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class ActivityTwo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
Log.e("TAG", "ActivityTwo onCreate() method is executed");
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.e("TAG", "ActivityTwo onStart() method is executed");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.e("TAG", "ActivityTwo onRestart() method is executed");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.e("TAG", "ActivityTwo onPause() method is executed");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e("TAG", "ActivityTwo onResume() method is executed");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e("TAG", "ActivityTwo onStop() method is executed");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.e("TAG", "ActivityTwo onDestroy() method is executed");
}
}
运行程序,显示界面如下图
查看log显示如下
可以看出 MainActivity分别执行了onCreate() ,onStart(),onResume()方法。此时MainActivity处于显示状态。
然后,我点击按钮startActivityTwo
界面如下:
查看log
可以看出 ,MainActivity执行了onPause()方法后,ActivityTwo执行了onCreate() ,onStart(),onResume()方法,紧接着MainActivity执行了onStop()方法此时MainActivity处于不可见状态(暂停)状态,ActivityTwo处于可见状态。
下一步,点击back(返回)键,显示界面如下:
查看log
可以看出
ActivityTwo执行了onPause()方法后,MainActivity执行了onRestart(),onStart(),onResume()方法,紧接着ActivityTwo执行了onStop(),onDestroy()方法。此时,ActivityTwo处于销毁状态,MainActivity处于可见状态。
最后点击back(返回)键,程序完全退出,界面如下
依旧查看log
可以看出MainActivity处于销毁状态,至此,两个Activity的生命周期结束。
三:总结分析结果
(一)当一个Activity第一次被创建时,依次执行onCreate() ,onStart(),onResume()方法,此时Activity处于可见状态。
(二)当一个Activity(例如MainActivity)被另一个Activity(例如ActivityTwo)给覆盖了,此时Activity(MainActivity))的onPause()方法会被立即执行,Activity(MainActivity)处于暂停状态,当其他的Activity(ActivityTwo)被创建且处于可见状态后,暂停状态的Activity(MainActivity)会执行onStop ()进入停止状态。即:MainActivity不可见状态。特别的,当此时的Activity被一个Dialog覆盖,这时的Activity并不是完全不可见,而是显示在dialog的后面,变得失去了焦点。所以这时的Activity处于暂停状态,而不是停止状态。只执行onPause()方法,不会执行onStop()方法。
(三)当其他Activity(ActivityTwo)销毁或者暂停(即:处于不可见状态),此时的Activity(MainActivity)会执行onRestart()方法(因为之前已经创建了,所以这里并不需要重新创建,只要重新启动即可),然后执行onStart(),onResume()方法(看最上面的定义即可)。MainActivity处于可见状态。特别的,如果是由于dialog引起的暂停状态要恢复到可见状态,那么这里也不会执行onRestart()方法,因为Activity没用停止,只是暂停了而已,所以不需要重新启动的。直接执行onStart(),onResume()方法即可。
(四)当一个Activity(MainActivity)完全销毁。会依次执行,先不可见onPause(),onStop(),再销毁onDestroy()方法,即先暂停后停止最后销毁。
结论:
可见状态:onCreate() ,onStart(),onResume()
不可见状态:onPause(),onStop ()
销毁状态 :onDestroy()