顯式 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);