Android学习笔记(4):Activity生命周期

前言:

Activity的生命周期不是自身控制的,而是由Android系统控制的。系统通过调用不同的方法,完成Activity不同状态的转换。本文将通过一个实例来帮助理解Activity生命周期。

本文要点:

1.理解生命周期

2.Activity状态扭转

一、生命周期概述

先上图:

activity_lifecycle

这幅图已经很完整的描述了Activity的生命周期,以及状态转换。但这里针对上图做几点说明:

(1)Activity生命周期中,有很多种状态。其中包括Resumed(运行态,可见且可交互),Paused(暂停,部分可见但不可交互),Stoped(停止态,不可见),Destroyed/Killed(销毁)等;

(2)Entire Lifetime,完整的生命周期从调用onCreate()开始,直至调用onDestroy()结束;

(3)Visible Lifetime,生命周期中可见的阶段,发生在调用onStart()之后,onStop()之前。处于Resumed,或Paused态,在这期间Activity处于屏幕上;

(4)Foreground Lifetime,生命周期可交互的阶段,在调用onResume()之后,onPause()之前。在这期间,Activity显示在所有其他Activity之前,并获取输入焦点。

(5)Android系统通过调用onCreate()方法创建Activity实例.onDestroy()方法释放,关闭Activity;

(6)Android系统通过栈管理Activities,屏幕最前端的Activity位于栈顶。不在栈顶的Activity一般处于Paused状态,Stoped状态,或者Destroyed中的一种;

(7)实际应用中,我们通过重载Android生命周期中不同的方法,实现对不同状态下Activity的控制。如:我们可以重载onCreate()方法,实现对数据库的初始化;重写onDestroy(),执行删除数据库操作等。

二、状态转换实例

这里继续使用上篇文章中的HelloActivity为例。

1.我们在MainActivity.java和DisplayMessageActivity.java中,重写(override)上图中的所有给出的方法,除了调用super.onXXX()之外,再添加下面这句代码:

Log.i("[xxxActivity]", "onXXX()");

说明:添加该方法目的是为了能在LogCat窗口中输入一段日志,直观显示Activity的调用顺序。

第一个参数值约定格式为[xxxActivity],用以区别不同Activity的日志,第二个参数用以标示调用了哪一个方法。

修改后的代码:

MainActity.java

View Code
 1 package com.wzhang.helloactivity;

 2 

 3 import android.os.Bundle;

 4 import android.app.Activity;

 5 import android.content.Intent;

 6 import android.util.Log;

 7 import android.view.Menu;

 8 import android.view.View;

 9 import android.widget.EditText;

10 

11 public class MainActivity extends Activity {

12 

13     public static final String EXTRA_MESSAGE = "com.wzhang.MainActivity.MESSAGE";

14 

15 

16     @Override

17     protected void onCreate(Bundle savedInstanceState) {

18         super.onCreate(savedInstanceState);

19         setContentView(R.layout.main);

20         Log.i("MainActivity", "onCreate()");

21     }

22 

23     @Override

24     protected void onStart(){

25         super.onStart();

26         Log.i("MainActivity", "onStart()");

27     }

28     

29     @Override

30     protected void onRestart(){

31         super.onRestart();

32         Log.i("MainActivity", "onRestart()");

33     }

34     

35     @Override

36     protected void onResume(){

37         super.onResume();

38         Log.i("MainActivity", "onResume()");

39     }

40     @Override

41     protected void onPause(){

42         super.onPause();

43         Log.i("MainActivity", "onPause()");

44     }

45     

46     @Override

47     protected void onStop(){

48         super.onStop();

49         Log.i("MainActivity", "onStop()");

50     }

51     @Override

52     protected void onDestroy(){

53         super.onDestroy();

54         Log.i("MainActivity", "onDestroy()");

55     }

56     

57     

58     @Override

59     public boolean onCreateOptionsMenu(Menu menu) {

60         // Inflate the menu; this adds items to the action bar if it is present.

61         getMenuInflater().inflate(R.menu.main, menu);

62         return true;

63     }

64     

65 

66     public void sendMessage(View view){

67         Intent intent = new Intent(this, DisplayMessageActivity.class);

68         EditText editText = (EditText) findViewById(R.id.txtMsg);

69         String message = editText.getText().toString();

70         intent.putExtra(EXTRA_MESSAGE, message);

71         startActivity(intent);

72     }

73 

74 }

DisplayessageActivity.java

View Code
 1 package com.wzhang.helloactivity;

 2 

 3 import android.os.Bundle;

 4 import android.app.Activity;

 5 import android.content.Intent;

 6 import android.util.Log;

 7 import android.view.Menu;

 8 import android.view.MenuItem;

 9 import android.widget.TextView;

10 

11 public class DisplayMessageActivity extends Activity {

12 

13     @Override

14     protected void onCreate(Bundle savedInstanceState) {

15         super.onCreate(savedInstanceState);

16 

17         Intent intent = getIntent();

18         String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

19         // Create the text view

20         TextView textView = new TextView(this);

21         textView.setTextSize(40);

22         textView.setText(message);

23         

24         setContentView(textView);        

25         Log.i("DisplayMessageActivity", "onCreate()");

26     }

27     @Override

28     protected void onStart(){

29         super.onStart();

30         Log.i("DisplayMessageActivity", "onStart()");

31     }

32     

33     @Override

34     protected void onRestart(){

35         super.onRestart();

36         Log.i("DisplayMessageActivity", "onRestart()");

37     }

38     

39     @Override

40     protected void onResume(){

41         super.onResume();

42         Log.i("DisplayMessageActivity", "onResume()");

43     }

44     @Override

45     protected void onPause(){

46         super.onPause();

47         Log.i("DisplayMessageActivity", "onPause()");

48     }

49     

50     @Override

51     protected void onStop(){

52         super.onStop();

53         Log.i("DisplayMessageActivity", "onStop()");

54     }

55     @Override

56     protected void onDestroy(){

57         super.onDestroy();

58         Log.i("DisplayMessageActivity", "onDestroy()");

59     }

60 

61     @Override

62     public boolean onCreateOptionsMenu(Menu menu) {

63         getMenuInflater().inflate(R.menu.display_message, menu);

64         return true;

65     }

66 

67     @Override

68     public boolean onOptionsItemSelected(MenuItem item) {

69         return super.onOptionsItemSelected(item);

70     }

71 

72 }

2.运行HelloActivity,在logCat中观察:

image

3.输入Hello Activity 点击send后:

image

4.点击image 回退按钮后:

image

5.退出HelloActivity后(红色警告我们这里不用理会):

image

 通过上面的实例,我们可以得到:

(1)Activity的成功启动,会依次调用:onCreate() -> onStart() -> onResume();(参考上述第2,3点截图)

(2)关闭一个Activity,系统会依次调用:onPause()->onStop()->onDestroy();(参考第4,5点截图)

(3)从一个MainActivity跳转到DisplayMessageActivity时,会先调用MainActivity.onPause(),当DispalyMessageActivity打开后,MainActivity会调用onStop()进入Stoped状态;(参考第4点截图)

(4)关闭DisplayMessageActivity回到MainActivity时,系统先调用DispalyMessageActivity.onPause() ,然后依次调用MainActivity.onRestart()->MainActivity.onStart()->MainActivity.onResume()进入Resumed状态,这之后DisplayMessageActivity才会继续关闭流程,完成Activity的关闭。(见第4点截图)

注:想深入了解Activity生命周期可参考Android官网的 API Guides

源码下载:LifeCycleActivity.rar

你可能感兴趣的:(Android学习)