老生常谈的问题——Activity的生命周期
Activity的生命周期
每个学习安卓的同桌应该都知道Activity是拥有自己的生命周期的。算起来这也是一个老生常谈的问题了。很多时候我们根本就没有体会这到底有什么作用,但实际上,了解Activity的生命可以让我们更好的理解页面切换、任务这些行为下发生的过程,开发出更加健壮的应用。
这张图片是官方文档给出的,概括起来就一句话:当你要用一个Activity时,它的状态会一直上升直到Resumed,而当Activity不再使用时,它的状态就会不断的下降直到Destroy。
这样讲还是很抽象,来看一个demo。
这个demo包括一个MainActivity、一个AnotherActivity和一个DialogActivity(就是使用了对话框主题的Activity)。
主界面是这样的。
布局就不贴出来了~~~来看看具体的代码:
1 public class MainActivity extends Activity { 2 3 private static final String LOG_TAG = "DEBUG"; 4 5 private Button btn_showDialog, btn_startDialogActivity, btn_startAnotherActivity; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 Log.d(LOG_TAG, "create"); 11 setContentView(R.layout.activity_main); 12 findView(); 13 setListener(); 14 } 15 16 private void findView() { 17 btn_showDialog = (Button) findViewById(R.id.btn_showDialog); 18 btn_startDialogActivity = (Button) findViewById(R.id.btn_startDialogActivity); 19 btn_startAnotherActivity = (Button) findViewById(R.id.btn_startAnotherActivity); 20 } 21 22 private void setListener() { 23 btn_showDialog.setOnClickListener(new OnClickListener() { 24 25 @Override 26 public void onClick(View v) { 27 Log.d(LOG_TAG, "启动对话框"); 28 new AlertDialog.Builder(MainActivity.this).setTitle("This is a dialog").show(); 29 } 30 }); 31 32 btn_startDialogActivity.setOnClickListener(new OnClickListener() { 33 34 @Override 35 public void onClick(View v) { 36 Log.d(LOG_TAG, "启动对话框形式的Activity"); 37 startActivity(new Intent(MainActivity.this, DialogActivity.class)); 38 } 39 }); 40 41 btn_startAnotherActivity.setOnClickListener(new OnClickListener() { 42 43 @Override 44 public void onClick(View v) { 45 Log.d(LOG_TAG, "启动普通的Activity"); 46 startActivity(new Intent(MainActivity.this, AnotherActivity.class)); 47 } 48 }); 49 } 50 51 @Override 52 protected void onStart() { 53 super.onStart(); 54 Log.d(LOG_TAG, "start"); 55 } 56 57 @Override 58 protected void onResume() { 59 super.onResume(); 60 Log.d(LOG_TAG, "resume"); 61 } 62 63 @Override 64 protected void onPause() { 65 super.onPause(); 66 Log.d(LOG_TAG, "pause"); 67 } 68 69 @Override 70 protected void onStop() { 71 super.onStop(); 72 Log.d(LOG_TAG, "stop"); 73 } 74 75 @Override 76 protected void onDestroy() { 77 super.onDestroy(); 78 Log.d(LOG_TAG, "destroy"); 79 } 80 81 }
这个也没什么好说的,就是对三个按钮设置监听器分别启动相应的界面,再有就是把状态打印出来。
好的,启动我们的程序来看看Logcat输出了什么:
嗯,这结果符合我们的预期。启动一个Activity应该是先onCreate再onStart再onResumed。
我们再点击一下“显示一个对话框”看看怎样:
可以看到,弹出了一个对话框,我们再来看看Logcat:
只有一个“启动对话框”就没有了,也就是说弹出一个对话框不会涉及来生命周期的切换的。
笔者当时就疑问了,因为官方的图中是这样写的:
看来不是所有的“partially visible”都会引起onPause这个方法的。
好的,我们按一下返回,再按“启动对话框形式的Activity”看看发生了什么:
嗯,这次就符合了。不出所料的话,按下返回就会调用onResumed方法了:
接下来,我们就启动一个新的Activity,再按返回
应该可以猜到了,这次不是“部分可见”了,所以应该会比上一次多一个onStop和onStartr的:
哈哈,果然没错!
最后当然就是按返回退出了:
好了,我们把基本的过程都模拟了一遍,现在来总结一下:
- Antivity的生命周期是从onCreate方法开始的,我们的组件也应该是在这里进行初始化。
- 当Activty部分可见的时候会进入pause状态,但并不是所有情况都是!
- 当Activity完全不可见时,会进入stop状态。(这个我不知有没有特例~~~)
- 当Activity被销毁的时候,onDestory会被调用。
- 总之,多动手多实践~~~