启动模式

1、为什么要研究启动模式

有时候我们的App需要生成给其他App调用的Activity,例如浏览器应用,照相机应用
解决生成重复页面等等Bug
任务栈过深的时候,避免一直按返回键也退不回想要的页面

2、任务栈

任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。

启动一个Application的时候,系统会为它默认创建一个对应的Task,用来放置根Activity。默认启动Activity会放在同一个Task中,新启动的Activity会被压入启动它的那个Activity的栈中,并且显示它。当用户按下回退键时,这个Activity就会被弹出栈,按下Home键回到桌面,再启动另一个应用,这时候之前那个Task就被移到后台,成为后台任务栈,而刚启动的那个Task就被调到前台,成为前台任务栈,手机页面显示的就是前台任务栈中的栈顶元素。

3、standard

Activity默认模式,所有的Activity遵循元素进栈出栈的特性,例如进栈序列为A->B->C->D,D呈现在页面上,按返回键出栈顺序久违D->C->B->A.

4、singleTop

栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。避免栈顶的activity被重复的创建。
在开始处,我们提到的2个Bug,可以用这种模式解决

   1、消息推送
   通知栏弹出Notification,点击Notification跳转到指定Activity,但是如果我现在页面就停留在那个指定Activity,
   会再次打开我当前的Activity,这样返回的时候回退的页面和当前页面一样,感官上就会很奇怪

   2、登录的时候
   登录成功跳转到主页,按下两次登录按钮,生成了两个主页。一些有启动延迟的页面(往往是动画,网络造成)
   也会有这样的情况。

   3、耗时操作返回页面
     还有一种场景 从activity A启动了个service进行耗时操作,或者某种监听,这个时候你home键了,
     service收集到信息,要返回activityA了,就用singleTop启动,实际不会创建新的activityA,只是resume了。

5、singleTask

1、栈内复用模式  

如果要启动的Activity在当前栈内启动,activity只会在任务栈里面存在一个实例。如果要激活的activity,
在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法, 
并且清空这个activity任务栈上面所有的activity。
        <activity android:name=".aty.MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".aty.Test1Activity"
            android:launchMode="singleTask" />
        <activity android:name=".aty.Test2Activity" />

XML配置 MainActivitiy,Test2Activity为standard模式,Test1Activity为singleTask模式。
入栈情况:
MainActivity—>Test1Activity—>Test2Activity—>MainActivity,如果此时启动Test1Activity,会清空Test1顶部元素 栈内情况变为MainActivity—>Test1Activity;

 2、主要就是在清单文件中配置android:taskAffinity="新的包名",因为android:taskAffinity
 这个字段默认指定的包名为本应用的包名,表示在本应用包名的任务栈内创建应用。如果设置了这个字段, 
 而且还和本应用包名不同,就会在新的任务栈创建任务。
         <activity
            android:name=".aty.Test1Activity"
            android:launchMode="singleTask"
            android:taskAffinity="com.test.newlaunch" />

SingleInstance

单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。
可以得出以下结论:
1. 以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例。
2. 以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
3. 以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。
4. 被singleInstance模式的Activity开启的其他activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。

换句话说,其实SingleInstance就是我们刚才分析的SingleTask中,分享Activity为栈底元素的情况。

本文转载的是 https://blog.csdn.net/zivensonice/article/details/51569502,具体的请戳!!!!

阅读更多
个人分类: Android
上一篇Linux中开机脚本的编写
下一篇Android 之 tools的作用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭