Activity

1. 在新的Activity启动之前,栈顶的Activity需要先pause,新的Activity才能启动,完成onCreate,onStart,onResume,之前的Activity再调用onStop。

2. onStart()与onStop()是从Activity是否可见的角度来调用的,onResume()和onPause()是从activity是否在前台的角度调用的。

3. Activity在异常情况下终止,会调用onSaveInstanceState来保存当前的activity状态,这个方法在onStop之前调用。它和onPause没有既定的关系,既可以在之前调用,也可以在之后调用。onSaveInstanceState这个方法只会在异常情况下调用,正常情况下不会调用。(activity会委托window去保存数据,接着window再委托它上面的顶级容器去保存数据,很可能是decorView)(view的绘制过程、事件分发都是采用了类似的委托思想)。

4. onRestoreInstanceState与onCreate的区别:onRestoreInstanceState一旦被调用,参数bundle一定是有值的,onCreate正常启动的话,bundle是为null的。

5.  Activity启动–>onCreate()–>onStart()–>onResume()

 点击home键回到桌面–>onPause()–>onStop()

 再次回到原Activity时–>onRestart()–>onStart()–>onResume()

 退出当前Activity时–>onPause()–>onStop()–>onDestroy()

6.  正常情况下横竖屏切换导致Activity销毁后重新执行,使用android:configChanges=”orientation|keyboardHidden” 防止屏幕切换时重新执行生命周期,在对应的Activity中重写:onConfigurationChanged 方法。

orientation :屏幕在纵向和横向间旋转 

keyboardHidden:键盘显示或隐藏 

如果缺少了keyboardHidden选项不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中,只能捕获竖屏变横屏的事件不能捕获横屏变竖屏

7. 启动模式:standard    singTop     singTask    singInstance

        标准模式: 默认模式。每次启动一个Activity都会重新创建一个新的实例。在这种模式下,谁启动了这个Activity,那么     这个Activity就运行在启动它的那个Activity的任务栈中。当我们用ApplicationContext 去启动standard模式的Activity就会报错,因为standard模式的Actiivty默认会进入启动它的Activity所属的任务栈中,但是由于非Activity类型的Context(如ApplicationContext)并没有所谓的任务栈,所以这就会出现错误。解决方法就是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建一个新的任务栈,这个时候启动Activity实际上以singleTask模式启动的。

       栈顶复用模式:在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法被回调,通过此方法的参数我们可以取出当前请求的信息。需要注意的是,这个Activity的onCreate,onStart不会被系统调用,因为它并没有发生改变。如果新的Activity已经存在但不是位于栈顶,那么新的Activity仍然会重新重建。

       栈内复用模式: 这是一种单例实例模式,这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent。具体一点,当一个具有singleTask模式的Activity请求启动后,比如Activity A,系统首先寻找任务栈中是否已存在Activity A的实例,如果已经存在,那么系统就会把A调到栈顶并调用它的onNewIntent方法,如果Activity A实例不存在,就创建A的实例并把A压入栈中。

      单实例模式:这是一种加强的singleTask模式,它除了具有singleTask模式所有的特性外,还加强了一点,那就是具有此种模式的Activity只能单独位于一个任务栈中,换句话说,比如Activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。

8.Activity启动模式的标记位:

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//指定singleTask模式,与在AndroidManifest.xml中指定android:launchMode=”singleTask”效果相同

Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

//指定singleTop模式,与在AndroidManifest.xml中指定android:launchMode=”singleTop”效果相同

Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

//具有这个标志的Activity启动时,在同一个任务栈中所以位于它上面的Activity都要出栈,一般会和singleTask模式一起出现

Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

//具有这个标志的Activity不会出现在历史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents=”true”,标记位优先级比在AndroidManifest中指定优先级高。

9. 启动其他应用的ActivitySingleTask和taskAfiinity配合使用。

10. taskAfiinity:每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。taskAfiinity与singleTask和allowTaskReparenting属性配对使用,其他情况下没有意义。

11. allowTaskReparenting:allowTaskReparenting属性的作用是Activity的迁移。当allowTaskReparenting属性和TaskAffinity配合使用时,Activity可以从一个任务栈迁移到另一个任务栈。

迁移的规则是:从一个与该Activity TaskAffinity属性不同的任务栈中迁移到与它TaskAffinity相同的任务栈中。

举个例子:当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting属性设置为true,那么当应用B被启动,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。
具体点来说,现在有两个应用A和B,A启动了B的一个Activity C,然后按Home键回到桌面,然后再单击B的桌面图标,这个时候不是启动了B的主Activity,而是重新显示了已经被应用A启动的Activity C。我们也可以理解为,C从A的任务栈转移到了B的任务栈中。
可以这么理解,由于A启动了C,这个时候C只能运行在A的任务栈中,但是C属于B应用,正常情况下,它的TaskAffinity值肯定不可能和A的任务栈相同,所以当B启动后,B会创建自己的任务栈,这个时候系统发现C原本想要的任务栈已经创建了,所以就把C从A的任务栈中转移过来了。

 

 

本文地址:https://blog.csdn.net/qq_29882585/article/details/107599869

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐