首页 > 编程知识 正文

win7启动顺序,activity启动模式使用场景

时间:2023-05-06 02:14:07 阅读:157180 作者:3192

小程序开发教程主要介绍了Activity启动模式的相关资料

推荐(免费) :小程序开发教程

前言

通常,当我们开始活动时,startActivity可能不知道活动的启动模式,但默认情况下会以默认启动模式启动。 但是,启动模式有时很重要。 例如,如果希望一次触发一个事件而不包含多个实例,则可能需要将其设置为singleTask模式。 所以,有必要了解这些启动模式。 另外,请注意启动模式启动方式。 启动方式是显示启动和隐式启动。 请不要混淆。 显示启动和隐式启动的后续步骤。 有专门的报道。

关于任务堆栈概述

要理解启动模式,首先需要理解任务堆栈的概念。 这里不涉及任务堆栈的实现原理等,这里主要简单介绍什么是任务堆栈。 我们启动的事件实例都放在一个叫做任务栈的东西里。 迭知道“后进先出”的特点。 例如,任务栏是羽毛球,活动例子是羽毛球,之后放入的东西只能先放。 所以在启动APP时,会自动创建任务堆栈,并在其中消除事件实例。 当我们按“上一步”放弃活动时,这些活动依次从任务堆栈中出来。 当然,一个app可以有多个任务堆栈。 例如,使用singleInstence启动的活动位于一个独立的任务堆栈中。 了解任务堆栈的概念后,我们来看看活动的四种启动模式。

分析Activity的四种启动模式

雷德尔

这是标准启动模式,默认为此启动模式。 每次启动此类启动模式活动时,都会创建一个新实例并将其放置在堆栈中,而不管堆栈中是否已经存在同一实例。 这个也是最容易理解的。

单一标题

mldgb,堆栈顶部是单个实例。 什么意思? 如果现在启动ActivityA,并且此时该ActivityA实例已经存在于堆栈的顶部,则此时不会创建新实例。 但是,如果非堆栈顶部存在同一实例,则会创建一个新实例。 例如,当前堆栈中的活动是ABC,a位于堆栈的顶部。 然后,在该时刻启动a不是创建另一个a活动,而是执行a的onNewIntent方法; 但是,如果此时调用C活动,则仍然会创建一个新的c实例,因为堆栈顶部是a,而不是c。 此时的堆栈状况为CABC。

单任务

单任务模式。 此模式意味着活动的启动堆栈只能存在单个实例,无论其是否位于堆栈顶部。 与其他启动模式不同,在此启动模式下可以指定堆栈来启动。 例如,现在有一个堆栈Main,但是如果为活动a指定堆栈名称dev,则在调用a时将创建一个名为dev的堆栈。 因此,singleTask意味着当dldds开始启动模式为singleTask的活动时,如果栈中没有相同的实例,它将创建一个新实例并将其放入栈中。 被指定的堆栈中存在相同的实例时,例如堆栈中有ABC,下次启动b时,此时不是制作新的b实例,而是将b放在堆栈的最上面,将a放在最上面,执行b的onNewIntent方法此时堆栈的状况为BC。

细心的读者会注意到“推开”。 是的,我知道迭是后进先出的特征。 例如,我在筒里放了三个羽毛球。 那么,想要得到中间的羽毛球,不是只能先把上面的羽毛球拿出来吗? 为了同样的理由,要把b提到堆栈顶部,必须把a突出来。 启动后可能有很多读者误认为是BC,但实际上是BC。 因为a离开堆栈后,b才会出来。 同样地,如果堆栈中为ADFBC,则这个开始b也为BC,上面的所有东西都被堆栈。

单一实例

单实例模式。 这是singleTask的强化版本。 他自己做新的堆栈,放入这个新的实例。 然后,这个堆栈只能包含这个事件实例。 因此,当重复调用此活动时,只要他在,调用此活动的onNewIntent方法切换到此堆栈就不会创建新的实例。

设置启动模式的两种方法

了解活动的四种启动模式后,接下来我们来看看如何为他指定启动模式。

静态设定

静态设置是指在AndroidManifest中将启动模式设置为特定活动。 通过为活动指定launchMode参数来设置启动模式。 例如:

1

2

activity style='margin: 0px; padding: 0px; 颜色: RGB (0,0,0 ); text-transform: none; 文本- indent : 0px; 间隔:正规; font-family: 'Helvetica Neue ',Helvetica,' PingFang SC ',MicrosoftYahoma,Arial,sans-serif; 字体大小: 14px; 字体样式: normal; 字体权重: 400; word-spacing: 0px; white-space :正规; orphans: 2; widows: 2; background-color : RGB (238、238、238; - web kit-text-stroke-width :0 px; 字体变型光: normal; 字体变-烂漫的龙猫: normal; 文本解码样式:初始化; 文本解码器

ation-color: initial;' 
     android:launchMode="singleInstance"/>

动态设置
动态设置是在启动活动的时候再指定启动模式,例如:

1

2

3

4

Intent intent = new Intent();

intent.setClass(this,SecondActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

可以看到我们通过intent.addFlags这个方法来指定启动模式,这个方法传入一个参数来指定启动模式,其他的参数有:

FLAG_ACTIVITY_NEW_TASK:singleTask模式
FLAG_ACTIVITY_SINGLE_TOP:singleTop模式
FLAG_ACTIVITY_CLEAR_TOP:清除该活动上方的所有活动。一般和singleTask一起使用。但是如果你的启动模式是standard,那么这个活动连他之上的所有活动都会被出栈再创建一个新的实例放进去。例如现在栈中是ABCD,以FLAG_ACTIVITY_CLEAR_TOP+standard模式启动C的时候,首先清理掉ABC,是的,C也会被清理,然后再创建一个新的C放进去,执行之后就是CD。
特别注意的坑
singleInstance返回任务栈
现在模拟一个场景:现在有三个活动 A,B,C。A和C的启动模式都是standard,B的启动模式是singleInstance。先启动A,再启动B,然后再启动C。这个时候问题来了,如果我这个时候按下返回键,是回到B吗?答案是回到A。再按一下呢,返回桌面吗?答案是回到B,再按一下再回到桌面。其实不难理解。我们都知道singleInstance会创建一个独立的栈,当我们启动A的时候,A位于栈First中,启动B的时候,就会创建一个栈Second并把B实例放进去。这个时候再启动C,就会切换到栈FIrst,因为singleInstance创建的栈只能放一个,所以C会放到栈First中,当按下返回的时候,栈First中的活动就会依次出栈,直到全部出完,才会切换到栈Second中。所以要注意这个点。

singleTask多任务栈启动问题
这个问题和上面singleTop的本质是一样的。模拟一个场景:现在有两个栈:First:ABC;Second:QWE。栈First位于前台,栈Second位于后台。A位于栈顶。这个时候以singleTask的模式启动W,会发生什么样的情况呢?首先会切换到栈Second,再把Q出栈,W提到栈顶,并执行W的onNewIntent方法。这个时候按返回键就会把Second栈中的活动依次出栈,全部出完后才会切换到栈First。

singleTask的TaskAffinity与allowTaskReparenting参数
前面我们讲到给singleTask模式指定要启动的任务栈的名字,怎么指定呢?可以在AndroidManifest中指定相关的属性,如下:

1

2

3

4

<activity style="margin: 0px; padding: 0px;" 
     android:launchMode="singleTask"

     android:taskAffinity="com.huan"

     android:allowTaskReparenting="true"/>

这里解释一下这两个参数

taskAffinity:指定任务栈的名字。默认的任务栈是包名,所以不能以包名来命名。
allowTaskReparenting:这个参数表示可不可以切换到新的任务栈,通常设置为true并和上面的参数一起使用。
我前面讲到可以给singleTask的活动指定一个栈名,然后启动的时候,就会切换到那个栈,并把新的活动放进去。但是如果设置allowTaskReparenting参数为false的话是不会切换到新的栈的。这个参数的意思是可不可以把新的活动转移到新的任务栈。简单点来说:当我们启动一个singleTask活动的时候,这个活动还是留在启动他的活动的栈中的。但是我们指定了taskAffinity这个参数,或者启动的活动是别的应用中的活动,那么就会创建一个新的任务栈。如果allowTaskReparenting这个参数是true的话,那么这个活动就会放到那个新的任务栈中。这样应该就可以明白了。所以这两个经常是配套一起使用的。

总结
活动的启动模式有四种,每种的功能都不一样,可以结合具体需要去使用,但是最重点还是要了解他的实现原理,栈中是怎么变化的,这个是比较重要的。了解这个之后那些特殊情况也就很容易理解了。
上面我讲的只是简单的使用,关于活动启动模式还有很多要了解。后续可能会解析一下,读者也可以自行去深度了解。

相关免费推荐:编程视频课程

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。