說明: java
一直不明白IntentFilter的做用,因而上網找資料。發現你們的說明都很難明白,沒有舉例說明。 android
對於IntentFilter的說明,我引用 h3c4lenovo 的:Android Intent action有什麼用??? 一文進行說明... app
如下是引文的大意(有修改): ide
一、場景 this
在講action以前,我跟你們回憶一個場景。 spa
好比說我在某個App中點擊拍照,會跳轉到照相機的界面。可是當我新裝了camer360或之類的第三方照相app的時候再點擊照相就會先彈出一個Dialog來讓我選擇是使用默認camer仍是camer360。 .net
二、顯式Intent 和 隱式Intent(根據場景來理解)
code
<1>顯式Intent:明確指出了目標組件名稱的Intent xml
顯式Intent直接用組件的名稱定義目標組件,這種方式很直接。可是因爲開發人員每每並不清楚別的應程序的組件名稱。所以,顯式Intent更多用於在應用程序內部傳遞消息。 blog
如:
Intent intent = new Intent(MainActivity.this,BActivity.class);
<2>隱式Intent:沒有明確指出目標組件名稱的Intent
隱式Intent它不會用組件名稱定義須要激活的目標組件,它更普遍地用於在不一樣應用程序之間傳遞消息。若是要跳轉到一個未知路徑,可是已知功能的Activity就要用到隱式intent。
如:
Intent intent = new Intent(Intent.ACTION_SEND);
實例一:
有三個Activity:MainActivity.java/BAcitvity.java/CActivity.java
假設這是一個照相應用MainActivity是程序入口,BActivity和CActivity均可以處理照相的內容
在咱們不會使用action的時候咱們要使這個應用既可使用BActivity照相,又能使用CActivity照相如何實現?
固然是在MainActivity中寫兩個Button,
new Intent(MainActivity.this,BActivity.class); new Intent(MainActivity.this,CActivity.class);
經過兩種不一樣的Intent來發起請求。那麼如何使用action來實現呢?
在AndroidManifest.xml中先這樣定義:
<activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".BActivity" android:label="@string/title_activity_main" android:launchMode="singleTask" > <intent-filter> <action android:name="com.h3c.intent.ACTION_VIEW"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> <activity android:name=".CActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="com.h3c.intent.ACTION_VIEW"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
實例說明:
在MainActivity中實現一個Button,點擊發送:new Intent("com.h3c.intent.ACTION_VIEW");
此時就會彈出一個Dialog讓咱們自動選擇是使用BActivity仍是使用CActiviy了
這也就是隱式intent,即發送一種類型的action.
可讓全部支持該類型的activity都收到消息,而後由用戶選擇使用哪一個activity處理。
總結:
引文的例子其實也就說出了IntentFilter的用法,其實IntentFilter就有點像Struts2裏的攔截器。固然,IntentFilter的
使用不止能夠在XML裏定義,還能夠用Java代碼來實現(我用了廣播的寫法,還能夠有自定義的寫法,主要是IntentFilter的跳轉不一樣而已。):
Intent.android.content.ContextWrapper.registerReceiver(BroadcastReceiver receiver,
IntentFilter filter)
// 廣播接收者 - 廣播的接收 private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 相關處理,如收短信,監聽電量變化信息 } }; //代碼中註冊: IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " ); registerReceiver( mBatteryInfoReceiver , intentFilter);
最後推薦一個講解更爲詳細的文章:android基礎知識06:intent和intentfilter