Android 顯示意圖和隱式意圖的區別

意圖在android的應用開發中是很重要的,明白瞭意圖的作用和使用後,對開發會有很大幫助。如果沒有把意圖搞懂,以後開發應用會感覺缺些什麼。
意圖的作用:
1、激活組件

2、攜帶數據
3、意圖的匹配(運用到隱式意圖)

android基本的設計理念是鼓勵減少組件間的耦合,因此android提供瞭Intent(意圖),用意圖激活其他組件。Intent提供瞭一種通用的消息系統,它允許在你的應用程序與其他應用程序間傳遞Intent來執行和產生事件。使用Intent可以激活android應用的三個核心組件:活動、服務和廣播接收器。Intent代表瞭要執行的某一種想法,要幹的某一件事情。
意圖可劃分為顯式意圖和隱式意圖。

顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定瞭組件名得Intent為顯式意圖,顯式意圖明確指定瞭Intent應該傳遞給那個組件。
如:Intent intent = new Intent();

intent.setAction(Activity1.this,Activity2.class);
startActivity(intent);
顯式意圖很簡單,此處就不再贅述。

隱式意圖:沒有明確指定組件名得Intent為隱式意圖。android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。

如調用電話撥號:Intent intent = new Intent();

intent.setAction(“android.intent.action.CALL”);

intent.setData(“Uri.parse(“tel:”) + mobile”);//mobile為電話號碼(是數字)
startActivity(intent);

如果采用隱式意圖來激活組件,是怎麼樣找到組件的?

解釋:如,電話撥號器在定義的時候,意圖過濾器(Intent-filter)是這樣定義的

產品經理必學的五個錦囊妙計 產品方法 產品思維 產品設計 交互體驗

1、先是有一個動作名稱,是由撥號器內部定義的,自己開發的應用也可以自己定義。
2、類別,在代碼中並沒有設類別,原因:當我們調用startActivity方法將intent意圖傳給操作系統時,startActivity方法的內部會為intent這個意圖添加進一個類別,這個類別就是android.intent.category.DEFAULT。

3、數據,數據包含兩個方面,數據所代表的Uri和數據的類型,此例中沒有數據的類型,隻有Uri,Uri又由scheme、主機名、路徑三部分組成,對於Uri的匹配,隻要跟給定的某一部分匹配就行瞭,此例中隻要和scheme匹配就行。

此時,代碼就可以和意圖過濾器匹配瞭,因此,它就會調用這個過濾器所在的Activity,由此實現電話撥號功能。

那麼,顯式意圖和隱式意圖分別在什麼場合使用呢?

顯式意圖一般在應用的內部使用,因為,在應用內部已經知道瞭組件的名稱,直接激活就行瞭。

當一個應用要激活另一個應用中的Activity時(看不到源代碼),隻能使用隱式意圖,根據Activity配置的意圖過濾器建一個意圖,讓意圖中的各項參數的值都跟過濾器匹配,這樣就可以激活其他應用中的Activity。所以,隱式意圖是在應用與應用之間使用的。(如果自己開發的應用,希望其中的某個Activity能讓其他應用訪問到,就為這個Activity定義一個意圖過濾器,則,其他應用就可以根據意圖過濾器中的參數設置意圖對象,然後傳給操作系統,操作系統就可以找到和這個意圖匹配的過濾器,找到過濾器後就可以激活意圖所在的Activity)

下面舉一個例子:

在FirstActivity中點擊按鈕跳到SecondActivity中(用隱式意圖):
在AndroidManifest中

<data android:scheme="itcast"
android:host=”www.itcast.cn”
android:path=”/person”/>

代碼:onCreate部分

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(“cn.itcast.xiao.li”);
intent.setDataAndType(Uri.parse(“itcast://www.itcast.cn/person”),

“image/gif”);

startActivity(intent);
}
});
}

其中,action的name隨便設,category的name也可以隨便設,不過android.intent.category.DEFAULT是調用startActivity時內部自動生成的。

在意圖過濾器中可以有多個動作和類別,但意圖隻能定義一個動作,所以隻要定義的這個動作(action)和意圖過濾器中的任意一個匹配就可以成功。類別(category)也是,隻要匹配其中一個就行,不必匹配所有。但是,如果定義的類別在意圖過濾器中找不到,就會報錯,也就是說意圖中定義的動作和意圖在過濾器中必須有。

註意:若intent.setDataAndType(Uri.parse(“itcast://www.itcast.cn/person”), “image/gif”);分開寫,即:intent.setData(),intent.setType()(括號中的東西略)時,就算是都匹配也會報錯。原因:在setType()文檔中有一句話,This method automatically clears any data that was previously set by setData(Uri).也就是說,當設置瞭setType時會自動清除setData中的內容。所以,解決方法:寫成intent.setDataAndType(Uri.parse(“itcast://www.itcast.cn/person”),
“image/gif”);這樣就正確瞭。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。