androidintent隱式
1. android 顯示intent和隱士inent的區別
以下內容為CSDN上(網名:yuan1590)對安卓顯示意圖和隱身意圖的總結(ps前人種樹,樹,後人乘涼,所以我就粘過來了,希望幫到您):
1. Intent
Android基本的設計理念是鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,
Intent提供了一種通用的消息系統,它允許在你的應用程序與其它的應用程序間傳遞 Intent 來執行動作和產生事件。
使用 Intent 可以激活 Android 應用的三個核心組件:活動(Activity)、服務(Service)和廣播接收器(BroadcastReceiver)。
2. 顯式意圖、隱式意圖
Intent可以劃分成顯式意圖和隱式意圖。
顯式意圖:調用Intent.setComponent() 或 Intent.setClassName() 或 Intent.setClass()方法明確指定了組件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。
如: 在 MainActicity 中打開一個新的 Acticity -- OtherActivity
1. Intent intent = new Intent();
2. intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));
3. 第二行代碼可以更換為:intent.setClass(MainActivity.this, OtherActivity.class);
4. 也可以使用構造器來指定組件: Intent intent = new Intent(MainActivity.this, OtherActivity.class)
三種 「顯式意圖」 指定方式等價
隱式意圖:沒有明確指定組件名的Intent為隱式意圖。
Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(data: URI和數據類型)找到最合適的組件來處理這個意圖
例如撥打電話的意圖:
Uri uri = Uri.parse("tel:" + phoneCode);
Intent intent = new Intent(Intent.ACTION_CALL, uri);
對於隱式意圖,Android是怎樣尋找到這個最合適的組件呢?記的前面我們在定義活動時,指定了一個intent-filter,Intent Filter(意圖過濾器)其實就是用來匹配隱式Intent的,當一個意圖對象被一個意圖過濾器進行匹配測試時,只有三個方面會被參考到:動作、數據(URI以及數據類型)和類別。
動作測試(Action test)
一個意圖對象只能指定一個動作名稱,而一個過濾器可能列舉多個動作名稱。如果意圖對象或過濾器沒有指定任何動作,結果將如下:
+ 如果過濾器沒有指定任何動作,那麼將阻塞所有的意圖,因此所有的意圖都會測試失敗。沒有意圖能夠通過這個過濾器。
<intent-filter><!-- 空的 --></intent-filter>
+ 另一方面,只要過濾器包含至少一個動作,一個沒有指定動作的意圖對象自動通過這個測試
類別測試(Category test)
對於一個能夠通過類別匹配測試的意圖,意圖對象中的類別必須匹配過濾器中的類別。這個過濾器可以列舉另外的類別,但它不能遺漏在這個意圖中的任何類別。
原則上一個沒有類別的意圖對象應該總能夠通過匹配測試,而不管過濾器里有什麼。大部分情況下這個是對的。
但有一個例外,Android把所有傳給startActivity()的隱式意圖當作他們包含至少一個類別:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。
因此自定義 Activity 的時候,不要以為光定義一個 action 就夠了。這樣用 startActivity() 來激活這個 Activity 的時候將一直報錯。
原因就是,他內部要求去匹配 android.intent.category.DEFAULT 這個類別。
因此,想要接收隱式意圖的活動必須在它們的意圖過濾器中包含"android.intent.category.DEFAULT"。
(帶"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"設置的過濾器是例外)
數據測試(Data test)
當一個意圖對象中的URI被用來和一個過濾器中的URI比較時,比較的是URI的各個組成部分。
例如,如果過濾器僅指定了一個scheme,所有該scheme的URIs都能夠和這個過濾器相匹配;
如果過濾器指定了一個scheme、主機名但沒有路經部分,所有具有相同scheme和主機名的URIs都可以和這個過濾器相匹配,而不管它們的路經;
如果過濾器指定了一個scheme、主機名和路經,只有具有相同scheme、主機名和路經的URIs才可以和這個過濾器相匹配。
當然,一個過濾器中的路徑規格可以包含通配符,這樣只需要部分匹配即可。
數據測試同時比較意圖對象和過濾器中指定的URI和數據類型。規則如下:
a. 一個既不包含URI也不包含數據類型的意圖對象僅在過濾器也同樣沒有指定任何URIs和數據類型的情況下才能通過測試。
b. 一個包含URI但沒有數據類型的意圖對象僅在它的URI和一個同樣沒有指定數據類型的過濾器里的URI匹配時才能通過測試。
這通常發生在類似於mailto:和tel:這樣的URIs上:它們並不引用實際數據。
c. 一個包含數據類型但不包含URI的意圖對象僅在這個過濾器列舉了同樣的數據類型而且也沒有指定一個URI的情況下才能通過測試。
d. 一個同時包含URI和數據類型(或者可從URI推斷出數據類型)的意圖對象可以通過測試,如果它的類型和過濾器中列舉的類型相匹配的話。
如果它的URI和這個過濾器中的一個URI相匹配或者它有一個內容content:或者文件file: URI而且這個過濾器沒有指定一個URI,那麼它也能通過測試。
換句話說,一個組件被假定為支持content:和file: 數據如果它的過濾器僅列舉了一個數據類型。
2. 如何使用ContentProvider類實現隱式Intent
舉例說明:
1、定義對應的ContentProvider類TestProvider,繼承ContentProvider。
類裡面需要實現一系列的abstract方法,如:OnCreate,getType,insert…
2、在應用程序的AndroidManifest.xml中加入<provider>標簽,例如:
<provider android:name="TestProvider"
android:authorities="com.android.test.settings"/>
android:name是指對應ContentProvider的類名,也就是所建的TestProvider類
android:authorities是標識部分,為了保證唯一性,這里使用完整的包名和類名
3、在想要調用的activity所對應應用的AndroidManifest.xml中,把該activity的intent-filter添加上對Data的要求
4、在StartActivity(intent)之前,設定該intent對應的action(調用setAction()指定)和data(調用setData(Uri.parse(content:// com.android.test.settings /test)))。StartActivity之後,Android系統內部就會根據上面Uri裡面的com.android.test.settings,去找到對應的TestProvider(根據android:authorities),然後再調用getType方法。這樣Android系統會根據getType返回的數據類型,以及intent在setAction時制定的action,去啟動對應的Activity
3. 在android中,顯示intent和隱示intent有什麼區別
可以這樣理解:
顯示Intent是指定一個Activity來啟動,比如你經理吩咐你去給他買杯奶茶;
而隱式Intent並不指定某一個Activity,而是指定一個特徵,比如你經理說「那個長得帥的給我去買杯奶茶」,雖然沒有指定你去執行,但是你覺得自己很帥,你也去響應了。另外,隱式Intent的話有可能有多個Activity去響應,這時候就需要用戶去操作選擇具體執行的Activity,比如說這時候你一個同事跑出來說「我長的也很帥 我去買」,這時候就有兩個人響應你經理號召了,然後你經理就從你們兩個人中選出他覺得比較帥的去買奶茶了,就是這樣
4. android當中顯式intent和隱式intent的區別
區別如下:
顯式啟動Activity指的是在Intent內部直接聲明要啟動的activity所對應的class。
隱式啟動Activity的intent到底發給哪個activity,需要進行三個匹配,一個是action, 一個是category,一個是data,可以是全部或部分匹配,同樣適用於Service和BroadcastReceiver。
A:顯式啟動
下面用代碼來解釋什麼是顯式啟動。
Intent intent=new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
B:隱式啟動
隱式啟動不同之處在於並不需要像Intent(MainActivity.this, SecondActivity.class)這樣傳參數然後再Start另一個Activity.需要在intent添加過濾器intentfilter。
<activity
android:name="com.example.android.tst.SecondActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="com.example.android.tst.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
這樣,需要在啟動另一個Activity的時候只需要如下方法就可以:
Intent intent=new Intent("com.example.android.tst.SecondActivity");
startActivity(intent);
5. Android中的顯式Intent 和 隱式Intent 有什麼區別
顯式Intent:即直接指定需要打開的Activity類,可以唯一確定一個Activity,意圖特別明確,所以是顯式的。設置這個類的zd方式可以是Class對象(如SecondActivity.class),也可以是包名加類名的字元串。應用程序內部Activity跳轉版常用這個方式。
隱式Intent:,隱式不明確指定啟動哪個Activity,而是設置Action、Data、Category,讓系統來篩選出合適的Activity。篩選是權根據所有的<intent-filter>來篩選。