安卓生命周期及启动模式学习

安卓生命周期及启动模式

1.Activity生命周期全面分析


  • 如下图所示,为activity生命周期全流程及切换过程
    安卓生命周期及启动模式学习_第1张图片

  • 生命周期方法如下表

方法 含义 作用
onCreate 表示Activity正在被创建 进行一些初始化的工作,如调用setContentView加载布局资源,初始化activity所需要的数据等
onRestart 表示Activity被重新启动 当当前Activity由不可见变成可见的时候会执行该方法,如用户启动新Activity或回到桌面等
onStart 表示Activity正在被启动 这个阶段Activity已经处于可见状态,但是还没有出现在前台,无法和用户进行交互,可以简单的理解为Activity已经处于可见状态但是用户看不见
onResume 表示Activity已经可见,且可以进行交互了 Activity可见,出现在前台并开始活动,注意onRestart时,还处于后台
onPause 表示Activity正在停止 紧接着onStop方法调用,特殊情况下,如果快速的回到当前Activity,则onResume方法会被调用,在这里可以做一些动画停止、数据存储等一些操作,但是不能执行耗时操作,原因:当前Activity的onPause方法被执行完,新Activity方法的onResume方法才会被执行
onStop 表示Activity即将停止 在这里可以进行一些轻量级的资源回收工作
onDestroy 表示Activity即将被销毁 是Activity的生命周期的最后一个回调,在这里进行最终的资源释放及回收工作
  • 具体说明:
  1. 第一次启动:onCreate→onStart→onResume;
  2. 打开新的Activity或回到桌面:onPause→onStop;
  3. 再次回到原Activity:onRestart→onStart→onResume;
  4. 按back键回退:onPause→onStop→onDestroy;
  5. 系统回收后再次启动,生命周期方法和第一种情况一样,这并不代表其过程是一样的。

注意:
onStart和onResume以及onPause和onStop虽然看起来差不多,但是它们所代表的具体含义不同,具体来说onStart和onPause是代表Activity是否可见,而onResume及onStop表示Activity是否位于前台。

2.异常情况下的生命周期分析


situation 1:资源相关的系统配置发生改变导致Activity被杀死并重新创建

当发生旋转屏幕、窗口大小改变、深色模式切换等操作时,系统为拿到不同模式下的资源配置,在默认情况下会导致Activity销毁被重新创建,除非设置了阻止它重建。销毁创建的具体过程如下图所示。 安卓生命周期及启动模式学习_第2张图片
在意外销毁时会通过onSaveInstanceState保存当前Activity状态,同时,将保存的数据通过bundle传给onCreate方法和onRestoreInstanceState方法,而后通过onCreate或onRestoreInstanceState方法把该Activity销毁时保存的数据重新读取。

注意

  1. 具体来说,一般onSaveInstanceState方法的调用是在onStop之后,onRestoreInstanceState的调用是在onStart方法之后。
  2. 当意外终止并恢复时,主要是采用了委托的思想,首先调用onSaveInstanceState保存数据,然后通知到Window方法去保存数据,最终委托到顶层容器去保存数据,在恢复时则是顶层容器通知子元素去恢复数据。

situation 2:资源内存不足导致低优先级的Activity被杀死

恢复过程基本和situation 1一致,在内存不足时,安卓优先级从低到高杀死目标Activity所在的进程,并通过onSaveInstanceState和onRestoreInstanceState保存和恢复数据。
Activity优先级定义:
1.前台Activity:正在和用户交互的Activity,优先级最高;
2.可见但非前台Activity;如弹窗导致Activity无法交互等;
3.位于后台的Activity,该Activity已经被暂停,优先级最低。
注意:为避免被杀,一些后台工作不能脱离四大组件运行,如一个进程没有四大组件运行,可能将会很快被杀死。

3.Activity启动模式

当前的四种启动模式:

  • standard:标准模式,默认的系统启动模式,每一次启动都会创建新的Activity,被创建的实例符合典型的生命周期,可以在同一个任务栈里面存在同一个Activity的不同实例,也可以存在于不同的任务栈里面,该模式下启动的Activity默认进入到启动该Activity的任务栈;
  • singleTop:栈顶复用模式,如果被启动的Activity在任务栈的栈顶已经存在了,则不会重新创建该Activity对象,启动时onNewIntent方法也会被回调,不会重新经历onCreate、onStart方法;
  • singleTask:栈内复用模式,只要目标栈内存在该Activity实例,就不会重新创建该Activity新实例,在启动过程中系统会首先需找目前任务栈并判断,若栈不存在,则重新创建新的任务栈,并创建新的实例,若当前栈实例不存在则重新创建新的实例。注意:当当前任务栈存在该实例且该实例不位于栈顶时,则该实例上面的所有其它实例都会被弹出
  • singleInstance:单实例模式,一种加强的singleTask模式,除具有singleTask模式的所有特性之外,此模式下的Activity对象只能单独的位于一个任务栈中,换句话说,当以该模式启动时,系统会为它创建新的任务栈。

3.InterFilter匹配规则

关于action、category的匹配规则不详细描述,只说明:action匹配的时候,Intent中所有声明的action只要其中之一匹配就可以,对于category则需要全部匹配。

data的匹配规则

data的匹配规则与action的匹配规则类似,data的数据结构如下所示,其由mimeType和URI组成:

<data
       android:host="string"
       android:mimeType="string"
       android:pathPattern="string"
       android:pathPrefix="string"
       android:port="string"
			 android:path="string"
       android:scheme="string" />

mimeType指媒体类型,如image/jpeg等,其它则组成URI,其中pathPattern代表可以包含通配符的路径,path表示完整路径信息,pathPrefix代表路径前缀,注意要为intent指定完整的data,则必须调用setDataAndType方法,不能单独设置,否则可能会导致前一个设置置空。

你可能感兴趣的:(安卓开发艺术探索学习,android)