Activity启动模式

来源:互联网 发布:国家药品数据库下载 编辑:程序博客网 时间:2024/06/06 03:12

学习了徐宜生的《Android群英会》一书总结出,大家可以去买书,非常值得一看

Activity与Activity调用栈分析

Android任务栈简介

当一个App启动时,如果当前环境中不存在该APP的任务栈,那么系统就会创建一个任务栈。以后这个APP所启动的Activity都将在这个任务战中被管理,这个栈也被称为一个Task,即表示若干个Activity的集合,他们组合在一起形成一个Task。

*特别注意:
一个Task中的Activity可以来自不同的APP,
同一个APP的Activity也可能不在一个Task中。*

新启动的Activity就会置于任务栈的顶端,并处于活动状态,而启动了另一个Activity的时候,新启动的Activity虽然功成身退,但依然保留在任务栈中,处于停止状态,当用户按下返回键或者调用finish()方法时,系统会溢出顶部Activity,让后面的activity恢复

AndroidMainifest启动模式

在AndroidMainifest文件中一共涉及了四种启动模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

standard

默认的启动模式,如果不指定Activity的启动模式,默认采用此方式。
这种模式每次都会创建新的实例,每次点击standard模式创建Activity后,都会创建新的MianActivity覆盖在原Activity上。

singleTop

系统会判断当前栈顶Activity是不是要启动的Activity,如果是则不创建新的Activity而是直接引用这个Activity;如果不是则创建新的Activity。

这种模式虽然不会创建新的实例,但是系统仍然会在Activity启动时调用onNewIntent()方法。

singleTask

与singleTop类似,只不过singleTop是检测栈顶元素是否是需要启动的Activity,而singleTask是检测整个栈中是否存在需要启动的Activity。如果存在,则将该Activity置于栈顶,并将该Activity以上的Activity都销毁。

不过这里是指在同一个App中启动这个singleTask的Activity,如果是其他程序以singleTask模式来启动这个Activity,那么它将创建一个新的任务栈。不过这里有一点需要注意的是,如果启动的模式为singleTask的Activity已经在后台一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台

当Activity2启动ActivityY(启动模式为singleTask)时,它所在的Task都被切换到前台,且按返回键返回时,也会先返回ActivityY所在的Task的Activity也就是ActivityX。

可以通过这种方式实现退出整个应用:将主Activity设置成singleTask模式,在要退出的Activity中转到主Activity,从而将主Activity之上的Activity全部清除,然后重写Activity的onNewIntent()方法,在该方法中加上一个finish();将最后一个Activity也结束掉,这样程序就完全退出了。

singleInstance

singleInstance这种启动模式和使用的浏览器工作原理类似。在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。

申明为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在这一个Activity。例子:如果应用A的任务栈中创建了MainActivity实例,且启动模式为singleInstance,如果应用B也想激活MainActivity,则不需要创建,两个应用共享该Activity的实例。这种启动模式常用于需要与程序分离额界面,如在SetupWizard中调用紧急呼叫。

如果在一个singleTop或者singleInstance的ActivityA中通过startActivityForResult()方法来启动另一个ActivityB,那么系统将直接返回Activity.RESULT_CANCELED而不会再去等待返回。这是由于系统在Framwork层做了对这两种启动模式的限制,因为Android 开发者认为,不同的Task之间,默认是不能传递数据的,如果一定要传,那就只能通过intent来绑定数据。

1 0
原创粉丝点击