四大组件之一的Activity组件,在应用中一个Activity可以用来表示一个界面,中文意思也可以理解为“活动”,即一个活动开始,代表Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。
有时间的童鞋还可以去理解以下四个基本概念,将有助于我们更好的了解Android系统内部机制:
Application、Activity、Activity栈、Task
三大基本状态:
Resumed:一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
Paused:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦健,所以不可与用户交互。
Stoped:当Activity被另外一个Activity覆盖、失去焦点并不可见时处于的状态。
Activiy的生命周期:
onCreate(Bundle savedInstanceState);
onStart();
onRestart();
onResume();
onPause();
onStop();
onDestroy();
Activity其实是继承了ApplicationContext这个类,我们可以重写以下方法,如下代码:
public class Activity extends ApplicationContext { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();}
为了便于理解,我们可以写一个Demo,通过一定的操作来观察Activity在生命周期中状态的变化情况。
第一步:新建一个Android工程,我这里命名为ActivityDemo.
第二步:修改ActivityDemo.java(我这里重新写了以上的七种方法,主要用Log打印),代码如下:
package com.example.activityins;import android.app.Activity;import android.os.Bundle;/** * Activity的三大状态和七大生命周期方法分析 */public class MainActivity extends Activity { /** * Activity创建时第一个调用的方法,通常我们再该方法中加载布局文件,初始化UI组件,事件注册等等 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("MainActivity-onCreate"); } /** * 再onCreate方法之后调用,用于显示界面,但当前用户还不能进行交互 */ @Override protected void onStart() { super.onStart(); System.out.println("MainActivity-onStart"); } /** * 当activity从stopped状态下被返回时调用,之后再调用onResume方法进入resumed状态 */ @Override protected void onRestart() { super.onRestart(); System.out.println("MainActivity-onRestart"); } /** * 在onStart方法后调用,执行完了该方法后,用户可进行交互,当前Activity进入resumed状态 * 当activity从Paused状态被重新返回时,会再次调用该方法,让Activity进入resumed状态 */ @Override protected void onResume() { super.onResume(); System.out.println("MainActivity-onResume"); } /** * 当其他Activity(透明或窗口模式)进入时,调用该方法,让当前Activity进入paused状态 * 当前Activity依然是可见状态,但不可交互。如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁 * 当前Activity被返回时调用onResume方法 */ @Override protected void onPause() { super.onPause(); System.out.println("MainActivity-onPause"); } /** * 当其他Activity完全覆盖该Activity时,调用该方法,当前Activity进入stopped状态 * 当前Activity是不可见状态。如果其他更高优先级的APP需要内存时,当前Activity可能会被销毁 * 当前Activity被返回时调用onRestart方法 */ @Override protected void onStop() { super.onStop(); System.out.println("MainActivity-onStop"); } /** * 当前activity被销毁时调用,通常在该方法中用来释放资源,当前activity被kill掉 */ @Override protected void onDestroy() { super.onDestroy(); System.out.println("MainActivity-onDestroy"); }}
接下来就是测试了,我们一边操作一边观察LogCat中的打印:
第一步:启动项目
在这一步骤中,Activity先后执行了onCreate()->onStart()->onResume()三个方法。
第二步:点击HOME键回到桌面
执行了onPause()->onStop()两个方法,这个时候,activity依然存在,只是我们看不到了,但并没有被销毁。
第三步:再次点击应用图标回到程序中,恢复页面
执行了onRestart()->onStart()->onResume()三个方法
第四步:点击BACK键退出程序
执行了onPause()->onStop()->onDestroy()三个方法,这个时候,程序被销毁。
第五步:在启动程序(也就是第一步)后,我们点击电源键锁屏
第六步:点击电源键点亮屏幕,并解锁
还有其他的情况,比如,在第一步后面,从任务切换的地方进入另一个应用程序,然后再回到我们的测试程序中,等等。
这些大家可以自己下来试一试。
现在,我们再回到上面去看Activity生命周期图,相信大家都能很容易的理解这张图了。