老生常谈的问题——Activity的生命周期

Activity的生命周期

 

每个学习安卓的同桌应该都知道Activity是拥有自己的生命周期的。算起来这也是一个老生常谈的问题了。很多时候我们根本就没有体会这到底有什么作用,但实际上,了解Activity的生命可以让我们更好的理解页面切换、任务这些行为下发生的过程,开发出更加健壮的应用。

这张图片是官方文档给出的,概括起来就一句话:当你要用一个Activity时,它的状态会一直上升直到Resumed,而当Activity不再使用时,它的状态就会不断的下降直到Destroy。

 

这样讲还是很抽象,来看一个demo。

这个demo包括一个MainActivity、一个AnotherActivity和一个DialogActivity(就是使用了对话框主题的Activity)。

主界面是这样的。

 

布局就不贴出来了~~~来看看具体的代码:

View Code
 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的:

 

哈哈,果然没错!

最后当然就是按返回退出了:

 

好了,我们把基本的过程都模拟了一遍,现在来总结一下:

  1. Antivity的生命周期是从onCreate方法开始的,我们的组件也应该是在这里进行初始化。
  2. 当Activty部分可见的时候会进入pause状态,但并不是所有情况都是!
  3. 当Activity完全不可见时,会进入stop状态。(这个我不知有没有特例~~~)
  4. 当Activity被销毁的时候,onDestory会被调用。
  5. 总之,多动手多实践~~~
posted @ 2012-11-18 19:53  孤~影  阅读(383)  评论(0编辑  收藏  举报