Android鬼點子-Activity的隱式調用

AWXTyl 8年前發布 | 22K 次閱讀 Android開發 移動開發 Android,Activity

啟動一個Activity分為兩種方式,分別是顯式調用另一種是隱式調用。顯式調用很簡單,這里主要介紹一下隱式調用。一個Intent原則上只能是顯式或者隱式,當它同時是顯式和隱式的時候,以顯式調用為主。

   隱式調用時Intent通過匹配IntentFilter里面所設置的信息找到需要啟動的Activity、Service和BroadcastReceiver。如果不匹配,則無法啟動。

   IntentFilter中有action、category、data標簽。只有三者同時都匹配,才算匹配成功。對了,一個Activity可以有多個IntentFilter,一個Intent只要能匹配上一個IntentFilter,就可以成功啟動activity。       首先說說action。下面是微博接入文檔中的一段配置

在進行微博分享前,需要在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中需要注意。

<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,以防沒有匹配就直接啟動,系統報錯

 

 本文由用戶 AWXTyl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!