Activity生命周期、启动模式及启动方式

2018-08-07  本文已影响0人  ComeAsExpected

一. 正常的生命周期


activity生命周期.jpg

相关提问:

onStart:表示Activity正在被启动,此时Activity已经可见但是还没有出现在前台,还在后台,不能和用户进行交互。可以理解为Activity已经显示出来了,但是我们还看不到;
onResume:表示Activity已经可见并且出现在前台并开始活动;
它两都表示Activity已经可见,但onStart的时候Activity还在后台,onResume的时候Activity才显示到前台。

FirstActivity:onPause
SecondActivity:onCreate
SecondActivity:onStart
SecondActivity:onResume
FirstActivity:onStop

二. 异常情况下的生命周期


异常情况下Activity重建过程.png

异常情况分类:

  1. 资源相关的系统配置发生改变(比如横竖屏切换且不做处理)导致Activity被杀死并重新创建
  2. 资源内存不足导致低优先级的Activity被杀死

注意:

onSaveInstanceState方法的调用时机:在onStop之前,和onPause没有既定的时序关系。这个方法只会出现在Activity异常终止的情况下,正常情况不会回调该方法。
onRestoreInstanceState方法的调用时机:在onStart之后

三. 四种启动模式

TaskAffinity参数:这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。该属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用,在其他情况下没有意义。

当TaskAffinity和allowTaskReparenting结合的时候,情况比较复杂。当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。

指定启动模式的方式:

  1. AndroidMenifest中指定Activity的launchMode。不能直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识。
  2. 在Intent中设置标记位,这种方式优先级高,两种方式同时存在时,以这种方式为主。无法为Activity指定singleInstance模式。

四. 启动Activity的方式

  1. 显式Intent
  2. 隐式Intent
    隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配,将无法启动目标组件。IntentFilter中的过滤信息有action、category、data。一个Activity中可以有多个IntentFilter,一个IntentFilter中的action、category、data可以有多个,只有一个Intent同时匹配任何一组IntentFilter中的action、category、data类别才算完全匹配,只有完全匹配才能启动目标组件。

注意:

  1. 当Manifest中有多个Activity与Intent所指定的匹配时,App会弹框出来让用户选择打开方式,每个Activity对应一个App的logo和名称,并没有Activity的相关信息。

  2. 为了避免找不到匹配的Activity而报错,可以先判断一下是否有可匹配的Activity。判断方法有如下几种,如果找不到匹配的Activity就会返回null。

上述方法中,第二个参数需要注意,我们一般使用PackageManager.MATCH_DEFAULT_ONLY这个标记位,这个标记位的含义是仅仅匹配那些在intent-filter中声明了"android.intent.category.DEFAULT"这个category的Activity。这个标记位的意义在于,只要方法不返回null,就一定可以成功启动新Activity。原因在category匹配规则中讲过。

五. 常用标记位

上一篇下一篇

猜你喜欢

热点阅读