美文网首页
理解Activity的启动模式

理解Activity的启动模式

作者: Kael_祈求者 | 来源:发表于2017-12-03 15:47 被阅读0次

    1、Activity的启动模式有哪几种,分别用于什么场景?

     standard : 标准模式
       这也是系统默认模式。每次启动Activity都会重新创建一个新的实列。不管这个实列是否存在。如果是用Context 去启动一个
       Activity的话,这时候会报错如下错误:
       Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the 
       FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
       这是因为标准模式会启动它的Activity所谓的任务栈中,但是非Activity类型是没有任务栈的,所以就会出现上面的问题了。解决
       这个问题的方法是: 启动Activity指定Flag 为: FLAG_ACTIVITY_NEW_TASK 标记位,这样启动的时候就会为它创建一个新的任
       务栈。相当于singleTask模式
      
     singleTop : 栈顶复用模式
       如果新Activity已经位于任务栈的栈顶,那么此Activity不会被创建,同时会调用onNewIntent()方法,通过此方法的参数我们取出当 
       前请求的信息。此时此Activity的onCreate,onStart 不会被系统调用。假设ABCD 此时D在栈顶中,如果D是栈顶复用模式。么
       启动D,这时候任务栈中还是为ABCD 同时onNewIntent()调用,如果D是标准模式。那么启动D,此时的任务栈为ABCDD,
       onNewIntent()也不会被调用.
    
     singleTask : 栈内复用模式
       这是一种单实列模式,在这种模式下,只要Actvity在一个栈中存在,那么多次启动这个Activity都不会创建实列,和singleTop一样也会调用onNewIntent(). 假设ABCD 任务栈中4个实列,此时B是singleTask 模式,D是栈顶,然后我启动B,这是时候任务栈中为AB两个实列,同时由于singleTask默认有clearTop的效果,会导致栈内所有在B上面的Activity全部出栈。所以此时任务栈中只有AB 两实列
    
     singleInstance : 
       单实例模式具有singleTask所有的特性,但是还有一点就是此模式是运行在单独一个任务栈中的。比如有个A->Activity为singleInstance模式,当其他Activity 启动A时,系统会为它创建一个新的任务栈,然后A运行在这个独立栈中。如果这个A-->
    Actvity 是个Android 闹铃界面,然后我去设置一个10点起床闹钟,然后按home键回到桌面,此时你打开B->Activity。然后等到10点钟此时A-->Activity 加载出来了,此时A就是用singleInstance模式来启动的,你按Back键返回,此时会回到了B-->Activity.
    如果用的singleTask模式的话,你按Back键返回此时应该回到 设置闹铃的界面。而不是B-->Activity
    

    2、清晰地描述下onNewIntent和onConfigurationChanged这两个生命周期方法的场景?

          (1)onNewIntent() 
          在singleTop,singleTask,singleInstance 模式下的Activity,再次启动相同的Activity都会被调用
    
          (2)onConfigurationChanged  
          onConfigurationChanged 当系统配置信息发生改变时会调用.当在改变屏幕方向、弹出软件盘和隐藏软键盘时等,不再去执行
          onCreate()方法,而是直接执行 onConfigurationChanged不过需要在AndroidManifest.xml中为Activity加上
          android:configChanges=“orientation|keyboard|screenSize” 这个属性, 如果没有在xml中配置,系统发生改变后会销毁当前
          Activity然后重新创建一个新的Activity,重新执行一次生命周期,不会执行onConfigurationChanged 方法
          常有的属性:
          orientation| screenSize 屏幕旋转 自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。所以需要加上
          screenSize 
          
    

    相关文章

      网友评论

          本文标题:理解Activity的启动模式

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