意圖的作用:
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);
顯式意圖非常easy。此處就不再贅述。
隱式意圖:沒有明白指定組件名得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)是這樣定義的
產品經理必學的五個錦囊妙計 產品方法 產品思維 產品設計 交互體驗
<Intent-filter>
<action android:name="android.intent.action.CALL"/>
<category android:name"android.intent.category.DEFAULT"/>
<data android:scheme="tel"/>
</Intent-filter>
1、先是有一個動作名稱。<action android:name="android.intent.action.CALL"/>是由撥號器內部定義的。自己開發的應用也能夠自定義。
2、類別,在代碼中並沒有設類別。原因:當我們調用startActivity方法將intent意圖傳給操作系統時,startActivity方法的內部會為intent這個意圖加入進一個類別。這個類別就是android.intent.category.DEFAULT。
3、數據,數據包括兩個方面。數據所代表的Uri和數據的類型。此例中沒有數據的類型,僅僅有Uri,Uri又由scheme、主機名、路徑三部分組成,對於Uri的匹配,僅僅要跟給定的某一部分匹配即可了,此例中僅僅要和scheme匹配即可。
此時,代碼就能夠和意圖過濾器匹配了,因此,它就會調用這個過濾器所在的Activity,由此實現電話撥號功能。
那么,顯式意圖和隱式意圖分別在什么場合使用呢?
顯式意圖一般在應用的內部使用,由於。在應用內部已經知道了組件的名稱。直接激活即可了。
當一個應用要激活還有一個應用中的Activity時(看不到源碼),僅僅能使用隱式意圖。依據Activity配置的意圖過濾器建一個意圖,讓意圖中的各項參數的值都跟過濾器匹配,這樣就能夠激活其它應用中的Activity。所以,隱式意圖是在應用與應用之間使用的。(假設自己開發的應用,希望當中的某個Activity能讓其它應用訪問到,就為這個Activity定義一個意圖過濾器,則。其它應用就能夠依據意圖過濾器中的參數設置意圖對象,然后傳給操作系統,操作系統就能夠找到和這個意圖匹配的過濾器,找到過濾器后就能夠激活意圖所在的Activity)
以下舉一個樣例:
在FirstActivity中點擊button跳到SecondActivity中(用隱式意圖):
在AndroidManifest中
<activity android:name=".SecondActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="cn.itcast.xiao.li" />
<action android:name="cn.itcast.xiao.zhang" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="cn.itcast.category.li" />
<data android:scheme="itcast"
android:host="www.itcast.cn"
android:path="/person"/>
<data android:mimeType="image/gif"/>
</intent-filter>
代碼: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");這樣就正確了。
