Android开发经验谈Android开发Android技术知识

Android开发【全面理解Activity】

2022-12-09  本文已影响0人  谁动了我的代码

一、 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 。

详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

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四个状态所在的生命周期:


activity的生命周期

oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()

上面图概括了android生命周期的各个环节,描述了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多个技术文档,可以供你查缺补漏学习!

文末

要正确实现生命周期的回调方法,从而使应用程序正确动作,需要注意以下几点:

上一篇下一篇

猜你喜欢

热点阅读