Activity的生命周期不是自身控制的,而是由Android系统控制的。系统通过调用不同的方法,完成Activity不同状态的转换。本文将通过一个实例来帮助理解Activity生命周期。
本文要点:
1.理解生命周期
2.Activity状态扭转
先上图:
这幅图已经很完整的描述了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
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
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中观察:
3.输入Hello Activity 点击send后:
5.退出HelloActivity后(红色警告我们这里不用理会):
通过上面的实例,我们可以得到:
(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。