安卓activity启动模式的应用场景

standard:默认,总是会生成一个新的实例加入栈中
singleTop:如果这个Activity已经位于栈顶,那么重用该实例,会调用其onNewIntent
singleTask:如果栈内已经有这个Activity的实例,那么调用其onNewIntent+ClearTop,即弹出该Activity上面所有的实例,没有的话就创建一个新的实例放入栈中
singleInstance:新建一个新的栈放置Activity
使用singleInstance 模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
假设B启动A,A启动C,其中A的启动模式为singleInstance,则:
返回的页面顺序是C-B-A


应用场景: 

singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
这种启动模式通常适用于接受到消息后显示的界面,例如QQ接受到消息后弹出Activity,如果一次来10条消息,总不能一次弹10个Activity。


singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。


singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。


参考:http://blog.csdn.net/CodeEmperor/article/details/50481726

                      http://www.androidchina.net/3173.html


  1. BrowserActivity uses singleTask. There is only one browser activity at a time and it doesn't become part tasks that send it intents to open web pages. While it might return to whatever most recently launched it when you hit back it is actually fixed at the bottom of its own task activity stack. It will share its task with activities that it launches like bookmarks.

  2. BrowserBookmarksPage uses singleTop. While there can be multiple instances of this activity, if there is already one at the top of the task's activity stack it will be reused and onNewIntent() will be called. This way you only have to hit back once to return to the browser if the bookmarks activity is started multiple times.

  3. AlarmClock uses standard. The user can launch multiple instances of this activity and these instances can be part of any task and anywhere in the activity stack. As a fairly simple application it doesn't really demand tight control of its activity. 

  4. AlarmAlert uses singleInstance. Only one alert activity at a time and it is always its own task. Anything it launches (if anything) becomes part of its own new task.

自己测试了一下 singleTask在栈里没有实例的时候 是会直接放到栈顶 还是会另开一个栈
A-》B(singleTask)-》C    经测试 taskID并没有发生改变
A-》B(singleInstance)-》C 经测试,A与C均在task21中 只有B在task22中
A-》B(singleInstance)-》C 然后C后退 后退到的是A A再后退,居然回了B,再后退是完全退出了

这是当时WY的面试题
11、详细展开说一下所有LaunchMode的应用场景
假如A-》B-》C,想让C后退直接到A,使用什么样的intentflag?
假如A-》B-》C,C使用singleTask,C后退,后退到什么地方呢?
所以第一个是B是singleInstance可以达成
第二个 C后退 后退到的还是B singleTask并没有另开一个栈

阅读更多
换一批

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