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

Activity的生命周期

 

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

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

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

 

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

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

主界面是这样的。

 

老生常谈的问题——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。

我们再点击一下“显示一个对话框”看看怎样:

 

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

可以看到,弹出了一个对话框,我们再来看看Logcat:

 

只有一个“启动对话框”就没有了,也就是说弹出一个对话框不会涉及来生命周期的切换的。

笔者当时就疑问了,因为官方的图中是这样写的:

 

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

看来不是所有的“partially visible”都会引起onPause这个方法的。

好的,我们按一下返回,再按“启动对话框形式的Activity”看看发生了什么:

 

 

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

嗯,这次就符合了。不出所料的话,按下返回就会调用onResumed方法了:

 

 

 

接下来,我们就启动一个新的Activity,再按返回

应该可以猜到了,这次不是“部分可见”了,所以应该会比上一次多一个onStop和onStartr的:

 

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

哈哈,果然没错!

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

 

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

  1. Antivity的生命周期是从onCreate方法开始的,我们的组件也应该是在这里进行初始化。
  2. 当Activty部分可见的时候会进入pause状态,但并不是所有情况都是!
  3. 当Activity完全不可见时,会进入stop状态。(这个我不知有没有特例~~~)
  4. 当Activity被销毁的时候,onDestory会被调用。
  5. 总之,多动手多实践~~~

你可能感兴趣的:(Activity)