Android鬼点子-Activity的隐式调用

AWXTyl 8年前
   <p>启动一个Activity分为两种方式,分别是显式调用另一种是隐式调用。显式调用很简单,这里主要介绍一下隐式调用。一个Intent原则上只能是显式或者隐式,当它同时是显式和隐式的时候,以显式调用为主。</p>    <p>   隐式调用时Intent通过匹配IntentFilter里面所设置的信息找到需要启动的Activity、Service和BroadcastReceiver。如果不匹配,则无法启动。</p>    <p>   IntentFilter中有action、category、data标签。只有<strong>三者同时都匹配</strong>,才算匹配成功。对了,一个Activity可以有多个IntentFilter,一个Intent只要能匹配上一个IntentFilter,就可以成功启动activity。       首先说说action。下面是微博接入文档中的一段配置</p>    <pre>  <code class="language-xml">在进行微博分享前,需要在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></code></pre>    <p>这里的有一个action的配置:com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY,当你的app启动微博分享消息返回之后,微博就是通过这个action配置的字符串信息,来找到你的app需要启动的Activity,并且启动它。<br> <strong>注意intent-filter中可以有多个action标签,Intent只要匹配上众多标签中的一个,就算action匹配上。还有action是大小写敏感的。</strong>Intent中是必须有一个action的。 Intent intent = new Intent(“com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY”);</p>    <p>   然后说说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中需要注意。</p>    <pre>  <code class="language-xml"><data android:scheme="string"        android:host="string"        android:port="80"        android:path="/string"        android:pathPattern="string"        android:pathPrefix="/string"        android:mimeType="text/plain"        /></code></pre>    <p>android:scheme、android:host、android:port、android:path、android:mimeType<br> data的前四个属性构成了URI的组成部分,mimeType设置了数据的类型,比如:image/jpeg。</p>    <p><strong>data元素组成的URI模型如下:scheme://host:port/path</strong></p>    <p>如果要指定data信息。要使用setDataAndType方法,不能使用setData或者setType方法,因为这两个方法会清除彼此的数据。</p>    <p>下面干货儿:<br> action有多个的时候,只要其中之一能够匹配成功即可,但是Intent中一旦设置多个catrgory,那么每个category都必须能够和过滤条件中的某个category匹配成功。对没错!这里说的是过滤条件中的<strong>某个</strong>,我翻遍了网上所有的资料,都是说的<strong>一个</strong>!!!我觉得这里逻辑上有问题,所以Intent中最好还是不要尝试多个catrgory吧。</p>    <p>对了,如果找到了多个匹配上的activity怎么办?到底启动哪一个?系统会弹出选择框,让你自己选!!!系统提供了resolveActivity方法来可以让你实现尝试取到所有匹配的Activity,以防没有匹配就直接启动,系统报错</p>    <p> </p>