简析Activity生命周期
Activity和所有的生物一样,也有生老病死这一说,这就是我们将要了解的Activity生命周期的概念。
一:生命周期
Activity的生命周期如下图所示:
Activity的生命周期分为四个阶段
(1)运行态:
应用程序启动之后,若Activity处于屏幕的最前端,可以与用户进行交互的界面,我们说其具有运行态。一个Activity从创建到运行态,需要经历onCreate-->onStart-->onResume三个阶段
(2)暂停态:
Activity被置于后台,但是用户仍然可见,失去焦点,只是暂时不能进行交互,调用onPause()进入暂停态。进入暂停态的Activity,若想重新回到运行态,需要调用onResume()方法
(3)停止态:
Activity被置于后台,完全被其他Activity挡住,失去焦点,不能交互,调用onStop()进入停止态。若想重新回到运行态,需经过onRestart()-->onStart()-->onResume()三个阶段,此时应注意实行onRestart方法之后程序进入到的是onStart而不是onCreate。也就是说:onCreate()方法,只被执行一次,onResume()无论在什么状态均需要执行,onStart()旨在创建和onestart()之后执行一次。
(4)终止态:
Activity被终止,比如点击"返回"键之后,将结束程序的执行,调用onDestory()方法,进入到终止态。若想重新回到运行态,需重新定义Activity。
二:作用
清晰的区分Activity的生命周期,在以后的编程操作中,我们可以清晰的知道哪些操作应该在哪些状态下运行。比如某功能,要求用户第一次登陆时要注册,在此登陆的时候则直接跳入,这样的功能我们应该在onCreate方法中是实现,因为onCreate在应用程序的执行中,只运行一次。
三:生命周期的调用时机
1:调用时机
这六个方法,不需要用户手动调用,由系统自动调用。然而不同的方法调用的时机却不相同。
测试方法:创建工程,在主界面中,重写六个方法,添加输出语句,执行程序,按上述几种状态,分别测试程序,看后台输出即可验证结果。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("onCreate"); } @Override protected void onStart() { super.onStart(); System.out.println("onStart"); } @Override protected void onResume() { super.onResume(); System.out.println("onResume"); } @Override protected void onRestart() { super.onRestart(); System.out.println("onRestart"); } @Override protected void onPause() { super.onPause(); System.out.println("onPause"); } @Override protected void onStop() { super.onStop(); System.out.println("onStop"); } @Override protected void onDestroy() { super.onDestroy(); System.out.println("onDestory"); }} |
测试结果:
①程Activity动,自动依次进入onCreate-->onStart-->onResume三个状态 ②按home键,Activity全被挡住,依次进入到onPause-->onStop两个状态 ③按返回键,终止程序执行,依次进入到onPause-->onStop-->onDestory状态 ④长按home键,重新执行程序,依次进入到onRestart-->onStart-->onResume三个状态 |
2: 思考
单击A页面按钮实现从页面A到页面B的跳转,此时两个Activity处于生命周期的什么状态下呢?
解决办法:
(1) 创建工程,编写自定义Act2,在Act2中添加如上代码
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act2); System.out.println("2----onCreate");}@Overrideprotected void onStart() { super.onStart(); System.out.println("2----onStart");}@Overrideprotected void onResume() { super.onResume(); System.out.println("2----onResume");}@Overrideprotected void onRestart() { super.onRestart(); System.out.println("2----onRestart");}@Overrideprotected void onPause() { super.onPause(); System.out.println("2----onPause");}@Overrideprotected void onStop() { super.onStop(); System.out.println("2----onStop");}@Overrideprotected void onDestroy() { super.onDestroy(); System.out.println("2----onDestory");} |
(2)在主界面上,添加跳转的实现及其他生命周期方法
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("1----onCreate"); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent i = new Intent(MainActivity.this,Act2.class); startActivity(i); } });}@Overrideprotected void onStart() { super.onStart(); System.out.println("1----onStart");}@Overrideprotected void onResume() { super.onResume(); System.out.println("1----onResume");}@Overrideprotected void onRestart() { super.onRestart(); System.out.println("1----onRestart");}@Overrideprotected void onPause() { super.onPause(); System.out.println("1----onPause");}@Overrideprotected void onStop() { super.onStop(); System.out.println("1----onStop");}@Overrideprotected void onDestroy() { super.onDestroy(); System.out.println("1----onDestory");} |
(3)运行工程,点击按钮,观看控制台,结果如下:
08-20 13:46:26.842: I/System.out(279): 1----onPause08-20 13:46:26.875: I/System.out(279): 2----onCreate08-20 13:46:26.875: I/System.out(279): 2----onStart08-20 13:46:26.875: I/System.out(279): 2----onResume08-20 13:46:27.212: I/System.out(279): 1----onStop |
答案:由于此时A界面正在被B界面覆盖,所以A界面先进入到onpause状态,随后B界面启动,进入onCreate-->onStart-->onResume三个状态,之后A界面被完全挡住,A界面到达onStop状态。
Activity生命周期十分重要,要重点掌握,以后我们会经常用到的,注意产生时机与作用,注意区别哦。。