Android Activity的四种启动模式

来源:互联网 发布:用手机淘宝注册账号 编辑:程序博客网 时间:2024/06/08 06:51

启动模式        

1)任务栈的概念:

问:一个手机里面有多少个任务栈?

答:一般情况下,有多少个应用正在运行,就对应开启多少个任务栈;  

       一般情况下,每开启一个应用程序就会创建一个与之对应的任务栈;

       二般情况下,如launchMode为 singleInstance,就创建自己单独的任务栈;

2)任务栈的作用:

它是存放Activity的引用的,Activity不同的启动模式,对应不同的任务栈的存放

可通过getTaskId()来获取任务栈的ID,如果前面的任务栈已经清空,新开的任务栈ID+1,是自动增长的;

3)启动模式:

在AndroidManifest.xml中的<activity>标签中可以配置android:launchMode属性,用来控制Actvity的启动模式;

在Android系统中我们创建的Acitivity是以栈的形式呈现的:

①、standard:默认的,每次调用startActivity()启动时都会创建一个新的Activity放在栈顶;

②、singleTop:启动Activity时,指定Activity不在任务栈栈顶就创建,如在栈顶,则不会创建,会调用onNewInstance()复用已经存在的实例

③、singleTask在任务栈里面只允许一个实例,如果启动的Activity不存在就创建,如果存在直接跳转到指定的Activity所在位置,

                     如:栈内有ABCD,D想创建A, 即A上的BCD相应的Activity将移除

④、singleInstance:(单例)开启一个新的任务栈来存放这个Activity的实例在整个手机操作系统里面只有一个该任务栈的实例存在,此模式开启的Activity是运行在自己单独的任务栈中的


问:同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

Singleinstance  运行在另外的单独的任务栈里面

比方说在激活一个新的activity时候, 给intent设置flag

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

   这个被激活的activity就会在新的task栈里面…

    Intentintent = new Intent(A.this,B.class);

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    startActivity(intent);

 

4)应用程序、进程、任务栈的区别

①、应用程序:

四大组件的集合

在清单文件中都放在application节点下

对于终端用户而言,会将其理解为activity

②、进程

操作系统分配的独立的内存空间,一般情况下,一个应用程序会对应一个进程,特殊情况下,会有多个进程

一个应用程序会对应一个或多个进程

③、任务栈:task stack(back stack)后退栈

       记录用户的操作步骤,维护用户的操作体验,

       专门针对于activity而言的,只用于activity

       一般使用standard,其他情况用别的

 

5)启动模式的演示

1、创建两个activity,布局中设置两个按钮,分别开启两个activity

第一、standard启动模式的:开启几个就会在任务栈中存在几个任务

01和02都是存在于一个任务栈中的


第二、在清单文件中将02的启动模式改为singletop,

此时02处于栈顶,就只会创建一个02的任务,再开启02,也不会创建新的


第三、将02的启动模式改为singletask

       如果02上面有其他任务栈,就会将其他的清除掉,利用这个已经创建的02

       当开启02的时候,即先将01清除,然后利用下面的02


第四、将02的启动模式改为singleinstance

       可以通过打印任务栈的id(调用getTaskId()方法)得知,两个activity不在同一个任务栈中

若先开启三个01,在开启02,任务栈如图:


再开启01,任务栈的示意图如下:


此时按返回键,会先一层一层清空01,最后再清空02

空进程:任务栈清空,意味着程序退出了,但进程留着,这个就是空进程,容易被系统回收;

问:

一个启动模式为singleTop的activity,如果再试图启动会怎样? 想问的是 onNewIntent()

Activity有一个 onNewIntent(Intent intent)回调方法,该方法我们几乎很少使用,导致已经将其忽略掉。该方
法的官方解释如下:

 This is called for activities that set launchMode to "singleTop" in their package, or if a client used the Intent.FLAG_ACTIVITY_SINGLE_TOP flag when calling startActivity. In either case, when the activity is re-launched while at the top of the activity stack instead of a new instance of the activity being started, onNewIntent() will be called on the existing instance with the Intent that was used to re-launch it. An activity will always be paused before receiving a new intent, so you can count on onResume being called after this method. Note that getIntent still returns the original Intent. You can use setIntent to update it to this new Intent.
上文大概意思如下:
该方法被启动模式设置为“singleTop”的Activity回调,或者当通过设置Intent.FLAG_ACTIVITY_SINGLE_TOP
的Intent启动Activity时被回调。在任何情况下,只要当栈顶的Activity被重新启动时没有重新创建一个新的 Activity
实例而是依然使用该Activity对象,那么onNewIntent(Intent)方法就会被回调。
当一个Activity接收到新Intent的时候会处于暂停状态,因此你可以统计到onResume()方法会被再次执行,当
然这个执行是在onNewIntent 之后的。
注意:如果我们在Activity中调用了getIntent()方法,那么返回的Intent 对象还是老的Intent(也就是第一
次启动该 Activity 时的传入的 Intent 对象),但是如果想让 getIntent()返回最新的 Intent,那么我们可以通过
setIntent(Intent)方法设置

原创粉丝点击