一、 Activity的生命周期
和其他手机 平台 的应用 程序 一样,Android的应用程序 的生命周期是被统一掌控 的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并适应它。
简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信 ,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 ,另外系统也不允许你占用太多资源 ,至少要保证电话功能吧,所以资源不足的时候也就有可 能被干掉。
言归正传,Activity的基本生命周期如下代码 所示:
Java 代码
public
class MyActivity extends Activity {
protected
void onCreate(Bundle savedInstanceState);
protected
void onStart();
protected
void onResume();
protected
void onPause();
protected
void onStop();
protected
void onDestroy();
}
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();
}
你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断 这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume 。
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:
- onCreate: 在这里创建界面 ,做一些数据 的初始化工作
- onStart: 到这一步变成用户可见不可交互 的
- onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个
Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来,注意:这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才启动
onstop: 变得不可见 ,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。
onPause,onstop, onDestroy,三种状态 下 activity都有可能被系统干掉为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。
实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回 滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。
Activity五个状态
Starting-> running-> poused-> stopped-> killed
关于activity四个状态所在的生命周期:
- 启动状态(Starting):Activity的启动状态很短暂,当Activity启动后便会进入运行状态(Running)。
- 运行状态(Running):Activity在此状态时处于屏幕最前端,它是可见、有焦点的,可以与用户进行交互。如单击、长按等事件。即使出现内存不足的情况,Android也会先销毁栈底的Activity,来确保当前的Activity正常运行。
- 暂停状态(Paused):在某些情况下,Activity对用户来说仍然可见,但它无法获取焦点,用户对它操作没有没有响应,此时它处于暂停状态。
- 停止状态(Stopped):当Activity完全不可见时,它处于停止状态,但仍然保留着当前的状态和成员信息。如系统内存不足,那么这种状态下的Activity很容易被销毁。
- 销毁状态(Destroyed):当Activity处于销毁状态时,将被清理出内存。
activity的生命周期
oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()
上面图概括了android生命周期的各个环节,描述了activity从生成到销毁的过程。
- onCreate() : 在Activity创建时调用,通常做一些初始化设置;
- onStart(): 在Activity即将可见时调用;
- onResume(): 在Activity已可见,获取焦点开始与用户交互时调用;
- onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用;
- onStop() : 在Activity对用户不可见时调用;
- onDestroy() :在Activity销毁时调用;
- onRestart() : 在Activity从停止状态再次启动时调用;
Activity四种启动方式
一个项目中会包含多个activity,系统中使用任务栈来存储这些activity,任务栈呢,是一种“后进先出”的栈结构。举个栗子:当我们多次启动同一个(没有设置启动方式–即默认的启动方式)的activity的时候,系统会创建多个实例依次进入栈中。当back返回的时候,每按一次,一个activity出栈。直至栈空为止。
Standard 标准模式
无论任务栈内是否已经存在要启动的Activity实列,都会创建一个Activity放入任务栈,并置于栈顶。 使用场景:默认使用大多数场景
SingleTop栈顶复用模式
如果任务栈已经存在一个要启动的Activity实列,就复用该Activity置于栈顶不会重新创建Activity的实列,复用Activity会执行onNewIntent方法,但是onCreate.onStart方法不会执行,因为它没有改变.如果任务栈中或者任务栈顶没有实例就创建一个Activity实例存入其中,置于栈顶。 使用场景:适合接收通知内容显示页面,当用户从任务栏中进入查看消息内容界面时,如果设置为singleTop时,这样每次行为都使用同一个实例,用户点击返回时不会存在多个消息页面的情况。
SingleTask栈内复用模式
如果栈内已经存在要启动的Activity实例,就把该Activity栈上面的activity清出栈,让该activity置于栈顶,如果复用它的onNewIntent方法会被回调,但是onCreate.onStart方法不会执行,因为它没有改变. 使用场景:APP的首页,当你需要到某个页面时,关闭之前所打开的Activity可以用到。
SingleInstance单实例模式
这种模式启动的Activity实例单独占用一个任务栈,也就是启动该模式的Activity同时给它分配一个任务栈。 使用场景:singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
以上就是Android开发基础中的Activity生命周期,Android的技术学习才刚刚开始,更多Android进阶技术学习尽在《Android核心技术手册》里面大大小小30多个技术文档,可以供你查缺补漏学习!
文末
要正确实现生命周期的回调方法,从而使应用程序正确动作,需要注意以下几点:
- 确保用户使用你时,应用程序可以接听电话或切换到其他应用程序,而不会崩溃。确保您的应用程序在用户不使用时不会消耗系统资源。
- 确保用户在从其他应用程序切换回您的应用程序时可以继续他们以前的工作,并且在切换用户屏幕或其他操作时不会崩溃或丢失用户数据。
网友评论