总结下Activity基本知识
Activity 的启动模式有哪几种,分别用于什么场景?
- Standard 标准模式
Standard其实很好理解,每次都会新建一个Activity,不管栈内是否有了这个Activity,每次都会创建新的Activity添加到栈内,成为新的栈顶。
生命周期 onCreate、onStart、onResume都会被调用。 - SingleTop 栈顶复用模式
当需要开启的Activity不在栈顶的时候,就会像Standard模式一样,新建一个实例放在栈顶。
如果当前开启Activity在栈顶,则不会新建,直接复用,onCreate,onStart不会被系统调用,由于它并没有发生改变。 onNewIntent方法会调用。onNewIntent在正常创建的时候不会被调用。 - SingleTask 栈内复用模式
如果要创建的页面,在栈内存在,则弹出其顶部其他Activity,该Activity成为栈顶。生命周期和SingleTop一样。当不存在的时候,和Standard一样。 - SingleInstance 单实例模式
SingleInstance比較特殊,是全局单例模式,是一种加强的SingleTask模式。它除了具有它所有特性外,还加强了一点:具有此模式的Activity仅仅能单独位于一个任务栈中。
SingleTask常用于项目主页,当别的页面想返回主页面的时候,确保有且只有主页一个页面。
SingleTop用于启动同一个页面的时候,这样可以降低内存。 - 遇到的问题
在一般页面内,我们经常会在onCreate方法内调用getIntent方法,获取要传递的参数,SingleTop和SingleTask进行复用的时候,getIntent获取到的数据会是第一次开启的老数据,我们这时候要注意利用onNewIntent获取新的数据资源。
启动模式的使用方式
- AndroidManifest.xml 内android:launchMode
<activity android:name=".MainActivity" android:launchMode="singleTop">
- 动态代码指定
Intent intent = new Intent();
intent.setClass(MainActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
- 两者区别
优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以动态指定方式为准。
限定范围:AndroidManifest无法直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识动态代码无法为Activity指定 singleInstance 模式。
Activity 的 Flags
- FLAG_ACTIVITY_NEW_TASK
作用是为Activity指定 “SingleTask”启动模式。跟在AndroidMainfest.xml指定效果同样。 - FLAG_ACTIVITY_SINGLE_TOP
作用是为Activity指定 “SingleTop”启动模式,跟在AndroidMainfest.xml指定效果同样。 - FLAG_ACTIVITY_CLEAN_TOP
具有此标记位的Activity,启动时会将与该Activity在同一任务栈的其他Activity出栈。一般与SingleTask启动模式一起出现。它会完毕SingleTask的作用。但事实上SingleTask启动模式默认具有此标记位的作用 - FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此标记位的Activity不会出如今历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果。它等同于在xml中指定Activity的属性
android:excludeFromRecents="true"
清晰地描述下 onNewIntent 和 onConfigurationChanged 这两个生命周期方法的场景
-
onNewIntent 什么情况会被触发呢?
通过上面的知识我们可以知道,以SingleTop或者SingleTask启动的Activity存在于栈内,而再次被启动的时候。
其实SingleInstance当处于同种情况下也会被触发onNewIntent。 -
onConfigurationChanged
默认情况下,当系统配置(如系统语言,屏幕方向)发生改变后,系统会销毁当前的activity重新创建一个新的activity,重新执行一次生命周期方法。
从Android 3.2 (API13) 开始,当设备旋转时,screenSize也会改变,因此需要设置android:configChange="orientation|screenSize"。在这种情况下,如果屏幕旋转方向,Activity则不会被销毁,他的onConfigurationChanged()方法会被调用,通过读取configuration来读取对象中最新的配置来适配UI界面。
configChange参数如下
参考文章
https://blog.csdn.net/lyc088456/article/details/79389727
https://www.jianshu.com/p/4b91c1e36954
网友评论