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

來源:互聯網
上載者:User

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中


















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");這樣就正確了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.