Activity总结



onNewIntent();launchMode为singleTask的时候,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但是系统不会调用onCreate,而是调用onNewIntent()

singleTask模式,将检查整个Activity栈中是否存在当前需要启动的Activity,如果存在,则将该Activity置顶,并将该Activity以上的Activity都销毁,不过这里指在同一个App中启动这个singleTask的Activity,如果其他程序已singleTask模式来启动这个Activity,那么他将创建一个新的任务栈,注意,如果启动模式为singleTask的Activity已经在后台一个任务栈中了,那么启动后,后台的任务栈将一起被切换到前台

singleTop和singleInstance特殊说明
如果在一个singleTop或者singleInstance的ActivityA中通过startActivityForResult()方法来启动另一个ActivityB那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待,这是由于系统在Framework层做了对这两种启动模式的限制

intent Flag启动模式
Intent.FLAG_ACTIVITY_NEW_TASK 使用一个新的Task来启动Activity,但启动的每份Activity都将在一个新的Task中,该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈。
FLAG_ACTIVITY_SINGLE_TOP  使用singleTop模式来启动一个Activity,与指定android:launchMode = “singleTop”效果相同
FLAG_ACTIVITY_CLEAR_TOP  使用singleTask模式来启动一个Activity,与指定android:launchMode = “singleTask”效果相同通常会和singleTask启动模式一起出现。如果被启动的Activity采用standard模式,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶
FLAG_ACTIVITY_NO_HISTORY  当Activity启动其他Activity后,该Activity就消失,不会保存在Activity栈中
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标记的Activity不会出现历史Activiy的列表中,某些情况下不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用,他等于在xml中指定Activity的属性android:excludeFromRecents = “true”

清空任务栈(在Androidmanifest中注册)
clearTaskOnLaunch  在内次返回该Activity时卖豆浆该Activity之上的所有Activity都清除
finishOnTaskLaunch  当离开这个Activity所处的Task,用户再次返回,该Activity就会被finish掉
alwayRetainTaskState  如果值为true,那么该Activity所在的Task将不接受任何清理命令,一直保持当前Task状态


使用singleTask实现退出整个应用
将主Activity设置为singleTask模式重写主Activity的onNewIntent()方法,在方法中加finish()

Activity生命周期的onPause()特殊情况:正常情况下,紧接着onStop()就会被调用,在特殊情况下,如果这个时候快速的再回到当前Activity、那么onResume会被调用

启动另一个Activity没如果新Activity采用透明主题,那么当前Activity不会执行onStop、

onCreate onDestory Activity的创建和销毁
oStart onStop Activity是否可见
onResume onPause Activity是否前台

异常情况下的生命周期分析
情况一 资源相关的系统配置发生改变导致Activity被杀死并重建 Activity异常情况下终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,他和onPause()没有既定的时序关系,这个方法只会在Activity异常情况下,正常情况下不会。,当Activity重新创建后,系统会调用onRestoreInstanceState,并且把onSaveInstanceState所保存的bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,从时序上看onRestoreInstanceState的调用时机在onStart之后。当异常情况下需要重新创建时,系统会默认保存当前Activity的视图结构,并在Activity重启后恢复这些数据(文本框的数据。listview的滚动位置 )  view的都有onSaveInstanceState和onRestoreInstanceState方法来保存数据

onCreate和onRestoreInstanceState中的Bundle的区别
onRestoreInstanceState一旦被调用其参数Bundle一定有值。onCreate如果正常启动的话,Bundle为null,所以必须有额外判断,这两个方法可以任选其一来恢复数据,但官方推荐在onRestoreInstanceState中恢复

情况二 资源内存不足导致优先级的Activity被杀死
Activity优先级从高到低
1.前台Activity
2.可见但非前台Activity
3.后台Activity

当某项内容发生改变,不想系统重新创建Activity可以个Activity指定configChanges属性
常用属性值locale:设备的本地位置发生改变,一般指切换了系统语言
                 orientation:屏幕方向改变
                 keybroadHidden:键盘的可访问性是否改变
当设置了该属性时,屏幕变化时会调用Activity的onConfigurationChanged方法。

Activity的启动模式
standard:标准模式  要点  ActivityA启动了ActivityB,那么B就会进入到A所在的栈中。

singleTop 如果新Activity已经位于栈顶,那么此Activity不会重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数可以取出当前请求的信息,需要注意的是,这个Activity的onCreate() 、onStart()不会被系统调用
   
TaskAffinity和allowTaskReparenting属性
TaskAffinity和allowTaskReparenting结合使用的时候,当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true时,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。
eg 现在有两个应用A和B,A启动了B的一个ActivityC,然后按Home键回到桌面,然后在单击B应用图标,这个时候并不是启动了B的主Activity,而是重新显示了已经被应用A启动的ActivityC

给Acticity设置启动模式
在Androidmanifest中注册 android:launchMode = “singleTask”
在Intent中设置标志位
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
以上两种方式的区别
代码方式的优先级高于在Androidmanifest,当两个同时存在时,以第二种方式为准
在Androidmanifest无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP表示,为代码设定无法指定ActivitysingleInstance模式

IntentFilter的匹配规则
原则上一个Intent不应该即使显示调用有事隐式调用,如果两者共存以显示调用为主
IntentFilter中的过滤信息action,category、data
当一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功

action匹配规则
Intent中的action必须能够和过滤器规则中的action匹配,一个过滤器可以有多个action,只要Intent中的action能够和过滤器规则中的任何一个action相同即可匹配成功,需要注意,Intent 中如果没有指定action,则匹配失败 action区分大小写。antion的匹配要求Intent中的action存在且必须和过滤器规则中的其中一个action相同

category匹配规则
Intent中含有category,那么所有的category都必须和过滤规则中的其中一个category相同。如果Intent没有category,仍可以匹配成功,不设置category,系统会默认为只添加你默认的category (android.intent.category.DEFAULT)

data的匹配规则
要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data,这里的完全匹配是指过滤规则中出现的data部分也出现在Intent的data中

eg
<intent-filter>
  <data android :mineType = "image/*"/>
   ...
</intent-filter>
这种情况下虽然过滤器规则没有指定URI,但是却又默认值,URI的默认值为content或者file才能匹配
intent,setSataAndType(Uri.pase("file://abc"),"image/pong")
如果为Intent指定完整的data,必须调用seetDataAndType方法,不能先调用setData,再调用setType,因为这两个方法彼此会清除对方的值

通过隐式启动一个Activity的时候,可以做一下判断,看是否有Activity能够匹配隐式Intent,如果不做判断就可能报错
onNewIntent();launchMode为singleTask的时候,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但是系统不会调用onCreate,而是调用onNewIntent()

singleTask模式,将检查整个Activity栈中是否存在当前需要启动的Activity,如果存在,则将该Activity置顶,并将该Activity以上的Activity都销毁,不过这里指在同一个App中启动这个singleTask的Activity,如果其他程序已singleTask模式来启动这个Activity,那么他将创建一个新的任务栈,注意,如果启动模式为singleTask的Activity已经在后台一个任务栈中了,那么启动后,后台的任务栈将一起被切换到前台

singleTop和singleInstance特殊说明
如果在一个singleTop或者singleInstance的ActivityA中通过startActivityForResult()方法来启动另一个ActivityB那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待,这是由于系统在Framework层做了对这两种启动模式的限制

intent Flag启动模式
Intent.FLAG_ACTIVITY_NEW_TASK 使用一个新的Task来启动Activity,但启动的每份Activity都将在一个新的Task中,该Flag通常使用在从Service中启动Activity的场景,由于在Service中并不存在Activity栈。
FLAG_ACTIVITY_SINGLE_TOP  使用singleTop模式来启动一个Activity,与指定android:launchMode = “singleTop”效果相同
FLAG_ACTIVITY_CLEAR_TOP  使用singleTask模式来启动一个Activity,与指定android:launchMode = “singleTask”效果相同通常会和singleTask启动模式一起出现。如果被启动的Activity采用standard模式,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶
FLAG_ACTIVITY_NO_HISTORY  当Activity启动其他Activity后,该Activity就消失,不会保存在Activity栈中
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标记的Activity不会出现历史Activiy的列表中,某些情况下不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用,他等于在xml中指定Activity的属性android:excludeFromRecents = “true”

清空任务栈(在Androidmanifest中注册)
clearTaskOnLaunch  在内次返回该Activity时卖豆浆该Activity之上的所有Activity都清除
finishOnTaskLaunch  当离开这个Activity所处的Task,用户再次返回,该Activity就会被finish掉
alwayRetainTaskState  如果值为true,那么该Activity所在的Task将不接受任何清理命令,一直保持当前Task状态


使用singleTask实现退出整个应用
将主Activity设置为singleTask模式重写主Activity的onNewIntent()方法,在方法中加finish()

Activity生命周期的onPause()特殊情况:正常情况下,紧接着onStop()就会被调用,在特殊情况下,如果这个时候快速的再回到当前Activity、那么onResume会被调用

启动另一个Activity没如果新Activity采用透明主题,那么当前Activity不会执行onStop、

onCreate onDestory Activity的创建和销毁
oStart onStop Activity是否可见
onResume onPause Activity是否前台

异常情况下的生命周期分析
情况一 资源相关的系统配置发生改变导致Activity被杀死并重建 Activity异常情况下终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法的调用时机是在onStop之前,他和onPause()没有既定的时序关系,这个方法只会在Activity异常情况下,正常情况下不会。,当Activity重新创建后,系统会调用onRestoreInstanceState,并且把onSaveInstanceState所保存的bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,从时序上看onRestoreInstanceState的调用时机在onStart之后。当异常情况下需要重新创建时,系统会默认保存当前Activity的视图结构,并在Activity重启后恢复这些数据(文本框的数据。listview的滚动位置 )  view的都有onSaveInstanceState和onRestoreInstanceState方法来保存数据

onCreate和onRestoreInstanceState中的Bundle的区别
onRestoreInstanceState一旦被调用其参数Bundle一定有值。onCreate如果正常启动的话,Bundle为null,所以必须有额外判断,这两个方法可以任选其一来恢复数据,但官方推荐在onRestoreInstanceState中恢复

情况二 资源内存不足导致优先级的Activity被杀死
Activity优先级从高到低
1.前台Activity
2.可见但非前台Activity
3.后台Activity

当某项内容发生改变,不想系统重新创建Activity可以个Activity指定configChanges属性
常用属性值locale:设备的本地位置发生改变,一般指切换了系统语言
                 orientation:屏幕方向改变
                 keybroadHidden:键盘的可访问性是否改变
当设置了该属性时,屏幕变化时会调用Activity的onConfigurationChanged方法。

Activity的启动模式
standard:标准模式  要点  ActivityA启动了ActivityB,那么B就会进入到A所在的栈中。

singleTop 如果新Activity已经位于栈顶,那么此Activity不会重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数可以取出当前请求的信息,需要注意的是,这个Activity的onCreate() 、onStart()不会被系统调用
   
TaskAffinity和allowTaskReparenting属性
TaskAffinity和allowTaskReparenting结合使用的时候,当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性为true时,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。
eg 现在有两个应用A和B,A启动了B的一个ActivityC,然后按Home键回到桌面,然后在单击B应用图标,这个时候并不是启动了B的主Activity,而是重新显示了已经被应用A启动的ActivityC

给Acticity设置启动模式
在Androidmanifest中注册 android:launchMode = “singleTask”
在Intent中设置标志位
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
以上两种方式的区别
代码方式的优先级高于在Androidmanifest,当两个同时存在时,以第二种方式为准
在Androidmanifest无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP表示,为代码设定无法指定ActivitysingleInstance模式

IntentFilter的匹配规则
原则上一个Intent不应该即使显示调用有事隐式调用,如果两者共存以显示调用为主
IntentFilter中的过滤信息action,category、data
当一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功

action匹配规则
Intent中的action必须能够和过滤器规则中的action匹配,一个过滤器可以有多个action,只要Intent中的action能够和过滤器规则中的任何一个action相同即可匹配成功,需要注意,Intent 中如果没有指定action,则匹配失败 action区分大小写。antion的匹配要求Intent中的action存在且必须和过滤器规则中的其中一个action相同

category匹配规则
Intent中含有category,那么所有的category都必须和过滤规则中的其中一个category相同。如果Intent没有category,仍可以匹配成功,不设置category,系统会默认为只添加你默认的category (android.intent.category.DEFAULT)

data的匹配规则
要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data,这里的完全匹配是指过滤规则中出现的data部分也出现在Intent的data中

eg
<intent-filter>
  <data android :mineType = "image/*"/>
   ...
</intent-filter>
这种情况下虽然过滤器规则没有指定URI,但是却又默认值,URI的默认值为content或者file才能匹配
intent,setSataAndType(Uri.pase("file://abc"),"image/pong")
如果为Intent指定完整的data,必须调用seetDataAndType方法,不能先调用setData,再调用setType,因为这两个方法彼此会清除对方的值

通过隐式启动一个Activity的时候,可以做一下判断,看是否有Activity能够匹配隐式Intent,如果不做判断就可能报错

你可能感兴趣的:(Activity总结)