Android鬼点子-Activity的隐式调用


       启动一个Activity分为两种方式,分别是显式调用另一种是隐式调用。显式调用很简单,这里主要介绍一下隐式调用。一个Intent原则上只能是显式或者隐式,当它同时是显式和隐式的时候,以显式调用为主。

       隐式调用时Intent通过匹配IntentFilter里面所设置的信息找到需要启动的Activity、Service和BroadcastReceiver。如果不匹配,则无法启动。

       IntentFilter中有action、category、data标签。只有三者同时都匹配,才算匹配成功。对了,一个Activity可以有多个IntentFilter,一个Intent只要能匹配上一个IntentFilter,就可以成功启动activity。

       首先说说action。下面是微博接入文档中的一段配置

1
2
3
4
5
6
7
8
9
10
11
在进行微博分享前,需要在AndroidManifest.xml中,在需要接收消息的Activity(唤起微博主程序的类)里声明对应的Action:ACTION_SDK_REQ_ACTIVITY,如下所示:
<activity
android:name="com.sina.weibo.sdk.demo.WBShareActivity"
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

这里的有一个action的配置:com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY,当你的app启动微博分享消息返回之后,微博就是通过这个action配置的字符串信息,来找到你的app需要启动的Activity,并且启动它。
注意intent-filter中可以有多个action标签,Intent只要匹配上众多标签中的一个,就算action匹配上。还有action是大小写敏感的。Intent中是必须有一个action的。 Intent intent = new Intent(“com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY”);

       然后说说category。首先,Intent中,category不是必须的。如果没有手动加category信息的话,系统会默认在startActivity的时候加上android.intent.category.DEFAULT。所以在上面的示例中需要加上这个category。category要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。也就是说,Intent中如果出现了category,不管有几个category,对于每个category来说,它必须是过滤规则中的定义了的category。我们可以通过addCategory方法为Intent添加category。

       最后是data。Intent中必须有data数据,Intent中的data必须和过滤规则中的某一个data完全匹配,过滤规则中可以有多个data存在,但是Intent中的data只需匹配其中的任意一个data即可。过滤规则中可以没有指定URI,但是系统会赋予其默认值:content和file,这一点在Intent中需要注意。

1
2
3
4
5
6
7
8
<data android:scheme="string"
android:host="string"
android:port="80"
android:path="/string"
android:pathPattern="string"
android:pathPrefix="/string"
android:mimeType="text/plain"
/>

android:scheme、android:host、android:port、android:path、android:mimeType
data的前四个属性构成了URI的组成部分,mimeType设置了数据的类型,比如:image/jpeg。

data元素组成的URI模型如下:scheme://host:port/path

如果要指定data信息。要使用setDataAndType方法,不能使用setData或者setType方法,因为这两个方法会清除彼此的数据。

下面干货儿:
action有多个的时候,只要其中之一能够匹配成功即可,但是Intent中一旦设置多个catrgory,那么每个category都必须能够和过滤条件中的某个category匹配成功。对没错!这里说的是过滤条件中的某个,我翻遍了网上所有的资料,都是说的一个!!!我觉得这里逻辑上有问题,所以Intent中最好还是不要尝试多个catrgory吧。

对了,如果找到了多个匹配上的activity怎么办?到底启动哪一个?系统会弹出选择框,让你自己选!!!系统提供了resolveActivity方法来可以让你实现尝试取到所有匹配的Activity,以防没有匹配就直接启动,系统报错

文章目录
|