【安卓笔记】成长第二步,Activity的启动模式与IntentFilter的匹配规则

一、Activity的启动模式

1.为什么需要启动模式

在默认的情况下,当我们多次启动同一个Activity时,系统会创建多个实例并把他们一一放在任务栈中,当我们按下back键的时候,任务栈又会把他们一个一个清除出栈,直到最后一个实例被清除,成为空任务栈的时候,这个栈就会被系统回收。知道了Activity的默认启动模式之后,我们就会发现,这样多次启动同一个Activity实在是太傻,所以Android提供了启动模式来修改系统的默认行为。

2.启动模式

2.1standard:标准模式。这是系统的默认模式。每启动一个Activity都会重新创建一个实例,不管这个实例是否存在。在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动他的那个Activity所在的栈中。比如ActivityA启动了A ctivityB(标准模式)B就会进入A所在的栈中。

2.2singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么这个Activity就不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。需要注意的是,这个Activity的OnCreate、OnStart方法不会被系统调用,因为他没有发生改变。如果新的Activity没有存在于栈顶,那么这个Activity任然会被重新创建。举个例子,现在有两个Activity A和B 现在要以栈顶复用模式启动B 第一种情况:如果B在栈顶,启动B之后,栈内变成了AB;第二种情况:如果B不在栈顶(BA),启动B之后变成了BAB

2.3singleTask:栈内复用模式。这是一种单实例模式,很简单和栈顶复用模式就一个字的区别,性质也差不太多,一个是在栈顶就复用,这个是只要在这个栈内就复用。

这里有个点要注意,当要启动的activity不在栈顶的时候,但是在栈内,他会干掉他上面的Activity,成为栈顶。

2.4singleInstance:单实例模式。这是一种加强的SingleTask模式,他除了具有栈内复用模式的特性外,还加强了一点,在此种模式下只能单独的位于一个任务栈中。简单的来说,一个Activity以singleInstance的模式启动,这个任务栈就只有这一个Activity。

3.如何指定启动模式

3.1:通过AndroidMenifest为Activity指定启动模式,如:

<activity

android:name="com.xy.mainActivity"

android:configChanges="orientation"

android:luanchMode="singleTask"

android:label="@string/app_name"/>

另一种情况是通过Intent设置标志来为启动的Activity指定启动模式,如:

Intent intent = new Intent(MainActivity.this;SecondActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

4.Activity的Flags

FLAG_ACTIVITY_NEW_TASK

这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该模式一样。

FLAG_ACTIVITY_SINGLE_TOP

这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该模式一样。

FLAG_ACTIVITY_CLEAR_TOP

有此标记的Activity被启动的时候,上面的Activity都会被出栈。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

有此标记的Activity不会出现在历史的Activity的列表中。


二:IntentFileter的匹配规则

IntentFilter中过滤的信息有action、category(类别)、data,一个过滤列表中action、category(类别)、data可以有多个,多有的action、category(类别)、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action、category(类别)、data类别才算完全匹配,只有完全匹配才能启动Activity。


1、action的匹配规则

action是一个字符串,一个过滤规则中可能有多个action,Intent的action只要能匹配上一个就行。action的匹配要求Intent中的action存在而且必须和过滤规则中的其中一个action相同,另外action区分大小写。

2、category的匹配规则

category是一个字符串,他和action过滤有点不同,如果Intent中有category,那么所有的category必须和过滤规则中其中一个category相同,简单说就是如果Intent出现了category,那么他所有的category都必须和过滤规则中的某一个category相同,当然Intent中可以没有category。action不同,它可以第一个action匹配上了,第二个可以不匹配上。

3、data的匹配规则

data过滤规则和action有点相同,如果过滤规则出现了data,Intent中必须出现可匹配的data。

data有两部分组成,mimeType和URI。mimeType指媒体类型,可以表示图片,文本,视频等不同的媒体格式。URI:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathpattern>],例如:

http://www.baidu.com:80/search/info

Scheme:URI模式,比如http、file、content等,如果URI中没有指定scheme,那么整个URI的其他参数无效,意味着这个URI也是无效的。

Host:URI主机名,比如www.baidu.com,如果URI中没有指定host,那么整个URI的其他参数无效,意味着这个URI也是无效的。

Port:URI中端口号,比如80,仅当Scheme和Host被指定了参数时,port参数才是有意义的。

Path:完整的路径信息

PathPattern:完整的路径信息,里面可以包括通配符“*”,表示0个或多个任意字符,要注意的是,根据正则表达式,“*”要写成“\\*”

PathPrefix:路径的前缀信息

另外,如果要为Intent指定完整的data,必须调用setDataAndType方法,不能分开调用setData和setType方法,因为这两个方法会彼此清除对方的值。比如:

public Intent setData(Uir data){

mData = data;

mType = null;

return this;

}

我们可以看出,在调用setData方法时,他会将mimeType设置为null,同理,在setType时,也会将URI置为null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值