欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  互联网

Activity

程序员文章站 2022-03-14 20:19:14
1.在新的Activity启动之前,栈顶的Activity需要先pause,新的Activity才能启动,完成onCreate,onStart,onResume,之前的Activity再调用onStop。2. onStart()与onStop()是从Activity是否可见的角度来调用的,onResume()和onPause()是从activity是否在前台的角度调用的。3. Activity在异常情况下终止,会调用onSaveInstanceState来保存当前的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

相关标签: 面试_Android