老生常谈的问题——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. 总之,多动手多实践~~~

转载于:https://www.cnblogs.com/yjiyjige/archive/2012/11/18/2776247.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值