美文网首页Android技术汇总
Activity 的启动模式总结

Activity 的启动模式总结

作者: 土肥圆的诺诺 | 来源:发表于2019-01-05 18:57 被阅读5次

    总结下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

    相关文章

      网友评论

        本文标题:Activity 的启动模式总结

        本文链接:https://www.haomeiwen.com/subject/lvcdrqtx.html