顯式Intent 和隱式 Intent 的區別

顯式 Intent :android

在知道目標組件名稱的前提下,去調用Intent.setComponent()、Intent.setClassName()或Intent.setClass()方法或者在new Intent(A.this,B.class)指明須要轉向到的Activity,app

顯式意圖明確指定了要激活的組件是哪一個組件,通常是在應用程序內部使用。this

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

------------------------------------------------------------------------------spa

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

code

//分享功能就是經過隱式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效率高,系統直接精肯定位要啓用的組件,但耦合度也高,若是經過這種方式調用一些系統組件的話,容易由於版本更新,類名、包名、包結構變化等緣由致使程序崩潰。xml

隱式意圖可以下降程序的耦合度,但因爲每次意圖執行的時候,系統都會搜索全部可用的 intentfilter,來查看是否有匹配的內容,因此效率更低
---------------------------------------------------------------------------blog


注意:it

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

io

<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>
//隱式Intent寫法爲:
Uri uri=Uri.parse("app://test");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
相關文章
相關標籤/搜索