隱式Intent與顯示Intent的區別

顯式Intent:通過指定Intent組件名稱來實現的,它一般用在知道目標組件名稱的前提下,去調用Intent.setComponent()、Intent.setClassName()或Intent.setClass()方法或者在new Intent(A.this,B.class)指明需要轉向到的Activity,顯式意圖明確指定了要激活的組件是哪個組件,一般是在應用程序內部使用

    Intent intent = new Intent();
    intent.setClassName("com.android.deskclock","com.android.deskclock.DeskClock");

    startActivity(intent);

隱式Intent:通過在清單文件中配置IntentFilter來實現的,它一般用在沒有明確指出目標組件名稱的前提下,當一個應用要激活另一個應用中的Activity時(看不到源代碼),只能使用隱式意圖,根據Activity配置的意圖過濾器建一個意圖,讓意圖中的各項參數的值都跟過濾器匹配,這樣就可以激活其他應用中的Activity。Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。一般是用於在不同應用程序之間,如果想隱式intent不可以被跨應用啓動只需要在AndroidManifest.xml對應的activity中配置android:exported="false"即可。

//分享功能就是通過隱式Intent完成的。
Intent sendIntent = new Intent();  
sendIntent.setAction(Intent.ACTION_SEND);  
sendIntent.putExtra(Intent.EXTRA_TEXT,"This is my text to send.");  
sendIntent.setType("text/plain");  
startActivity(sendIntent); 

使用隱式intent啓動activity的時候如果有兩個action配置是一樣的,那麼啓動的時候系統就會彈出對話框讓你選擇去啓動哪一個,那麼怎麼過濾掉自己不想啓動的哪一個呢,可以自定義URL使用Scheme方式喚起Activity或App,這樣就可以對同一個action進行區分了! 

<intent-filter>
       <action android:name="android.intent.action.VIEW"></action>  
       <category android:name="android.intent.category.DEFAULT"></category>
       <category android:name="android.intent.category.BROWSABLE"></category>   
       <data
            android:scheme="app"
            android:host="test">
       </data>  
</intent-filter>

<!-- 
android:scheme="app"表示配置接受的協議爲app,相當於http://www.baidu.com中的http或者https
android:host="test"表示配置接受的域名爲test,相當於http://www.baidu.com中的www.baidu.com
-->
//隱式Intent寫法爲:
Uri uri=Uri.parse("app://test");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);

 

顯示intent效率高,系統直接精確定位要啓用的組件,但耦合度也高,如果通過這種方式調用一些系統組件的話,容易因爲版本更新,類名、包名、包結構變化等原因導致程序崩潰。隱式意圖能夠降低程序的耦合度,但由於每次意圖執行的時候,系統都會搜索所有可用的intentfilter,來查看是否有匹配的內容,所以效率更低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章