【Android】Intent介绍及Intent在Activity中的使用方法
本篇博文主要介紹Intent的相關(guān)概念,以及Intent在Activity中的使用方法。
?
1.Intent的實現(xiàn)過程
在Android中,Intent不僅可用于應(yīng)用程序之間的交互,也可用于應(yīng)用程序內(nèi)部的Activity/Service之間的交互。
Intent負(fù)責(zé)對應(yīng)用中一次操作進行描述,描述內(nèi)容包括動作以及動作所涉及的數(shù)據(jù),Android中的Intent機制則根據(jù)此描述,找到對應(yīng)的組件,將Intent傳遞給該被調(diào)用組件,完成對組件的一次調(diào)用。
這便是Intent的實現(xiàn)過程,可見,在Intent中提供了組件互相調(diào)用的相關(guān)信息,實現(xiàn)了調(diào)用者與被調(diào)用者之間的解耦。
2.Intent的應(yīng)用場合
歸納起來,Intent的應(yīng)用場合主要有以下三種:
2.1啟動一個Activity
(1)Activity.startActivity(Intent?intent); //啟動一個Activity
(2)Activity.startActivityForResult(Intent?intent,?int?requestCode); //啟動一個帶請求碼的Activity,當(dāng)該Activity結(jié)束時將回調(diào)原Activity的onActivityResult()方法,并返回一個結(jié)果碼。
2.2啟動一個Service
(1)Context.startService(Intent?service);?
(2)Context.bindService(Intent?service,?ServiceConnection?conn,?int?flags);?
2.3啟動一個Broadcast
(1)sendBroadcast(Intent?intent);?
? sendBroadcastAsUser(Intent?intent,?UserHandle?user);?
(2)sendStickyBroadcast(Intent?intent);?
????? ? sendStickyBroadcastAsUser(Intent?intent,?UserHandle?user);?
(3)sendOrderedBroadcast(Intent?intent,?String?receiverPermission);?
? sendOrderedBroadcastAsUser(Intent?intent,?UserHandle?user,?String?receiverPermission,
?BroadcastReceiver?resultReceiver,Handler?scheduler,?int?initialCode,?String?initialData,?Bundle?initialExtras);?
?
3.Intent屬性設(shè)置
Intent的屬性設(shè)置包括:Action(要執(zhí)行的動作)、Data(執(zhí)行動作所操作的數(shù)據(jù))、Type(顯式的指定Intent的數(shù)據(jù)類型)、Category(執(zhí)行動作的附加信息)、Component(指定Intent目標(biāo)組件的類名稱)、Extras(其它所有附加信息的集合)。????
3.1?Action(要執(zhí)行的動作)
在SDK中定義了一系列標(biāo)準(zhǔn)動作,其中的一部分如圖1所示。
圖1?部分標(biāo)準(zhǔn)動作
其中,ACTION_CALL表示調(diào)用撥打電話的應(yīng)用;ACTION_EDIT表示調(diào)用編輯器;ACTION_SYNC表示同步數(shù)據(jù)。
3.2?Data(執(zhí)行動作所操作的數(shù)據(jù))
在Intent中,Data使用指向數(shù)據(jù)的URI來表示。比如,在聯(lián)系人應(yīng)用中,指向聯(lián)系人列表的URI是content://contacts/people/。
3.3?Type(顯式的指定Intent的數(shù)據(jù)類型)
對于不同的動作,其URI數(shù)據(jù)的類型是不同的。
通常,Intent的數(shù)據(jù)類型能夠根據(jù)其數(shù)據(jù)本身進行判定,但是通過設(shè)置這個屬性,可以強制采用顯式指定的類型。
3.4?Category(執(zhí)行動作的附加信息)
Category表示執(zhí)行動作的附加信息。比如,當(dāng)我們想要讓所執(zhí)行的動作被接收后,作為頂級應(yīng)用而位于其他所有應(yīng)用的最上層,并可以使用附加信息LAUNCHER_CATEGORY來實現(xiàn)。?
3.5?Component(指定Intent目標(biāo)組件的類名稱)
Component用于指定Intent目標(biāo)組件的類名稱。通常,Android會根據(jù)Intent?中所包含的其它屬性信息(比如Action、Data/Type、Category)進行查找,并找到一個與之匹配的目標(biāo)組件。但是,如果我們設(shè)置了Component屬性,明確的指定了Intent目標(biāo)組件的類名稱,那么上述查找過程將不需要執(zhí)行。?
3.6?Extras(其它所有附加信息的集合)
使用extras可以為組件提供擴展信息。
4.Intent解析過程
在使用Intent時,根據(jù)是否明確的指定Intent對象的接收者,而分為兩種情況。一種是顯式的Intent,即在構(gòu)造Intent對象時就指定其接收者;另一種是隱式的Intent,即在構(gòu)造Intent對象時,并不指定其接收者。
對于顯式的Intent來說,Android不需要解析Intent,因為目標(biāo)組件已經(jīng)很明確。對于隱式的Intent來說,Android需要對其進行解析,通過解析,將Intent映射給可以處理該Intent的Activity、Service或Broadcast。????????
Intent解析機制是通過查找注冊在AndroidManifest.xml文件中的所有IntentFilter,以及IntentFilter所定義的Intent,找到最匹配的Intent。
在解析過程中,Android通過判斷Intent的Action、Type、Category這三個屬性,從而找出最匹配的Intent,具體的判斷方法如下:
(1)如果Intent指明了Action,則目標(biāo)組件IntentFilter的Action列表中就必須包含有這個Action,否則不能匹配;
(2)如果Intent沒有提供Type,系統(tǒng)將從Data中得到數(shù)據(jù)類型。目標(biāo)組件的數(shù)據(jù)類型列表中必須包含Intent的數(shù)據(jù)類型,否則不能匹配。
(3)如果Intent中的數(shù)據(jù)不是content:?URI,而且Intent也沒有明確指定它的Type,將根據(jù)Intent中數(shù)據(jù)的scheme?(比如?http:?或者mailto:)?進行匹配。同理,Intent?的scheme必須出現(xiàn)在目標(biāo)組件的scheme列表中,否則不能匹配。
(4)如果Intent指定了一個或多個Category,這些類別必須全部出現(xiàn)在目標(biāo)組件的類別列表中,否則不能匹配。
?
5.Intent使用實例
下面介紹幾個使用Intent的實例。
5.1調(diào)用其他的應(yīng)用
通過Intent可以調(diào)用并啟動別的應(yīng)用程序,比如調(diào)用撥打電話的程序,便可以使用如下的方法來完成:
1 /* 2 * Function : 調(diào)用撥打電話的程序 3 * Author : 博客園-依舊淡然 4 */ 5 public void intentDemo_Call() { 6 Intent intent_call = new Intent(); //創(chuàng)建一個意圖 7 intent_call.setAction(Intent.ACTION_CALL); //設(shè)置意圖為打電話 8 intent_call.setData(Uri.parse("tel:110")); //設(shè)置電話號碼 9 startActivity(intent_call); //啟動意圖 10 }當(dāng)然了,因為這里使用到了打電話的功能,我們還需要在AndroidManifest.xml文件中,添加申請打電話的資源權(quán)限,具體實現(xiàn)方法如下:
1 <!-- 打電話的權(quán)限 --> 2 <uses-permissionandroid:name="android.permission.CALL_PHONE" />
有關(guān)Android中的權(quán)限請求可以參閱《Android數(shù)據(jù)手冊02:android.permission權(quán)限請求匯總》。
5.2跳轉(zhuǎn)到另一個Activity
通過使用Intent不僅可以調(diào)用別的應(yīng)用程序,還可以實現(xiàn)應(yīng)用程序內(nèi)部之間Activity的跳轉(zhuǎn)。比如如下的代碼便實現(xiàn)了從MainActivity跳轉(zhuǎn)到SecondaryActivity,并向SecondaryActivity中傳遞了兩個數(shù)據(jù)name和age。
1 /* 2 * Function : 跳轉(zhuǎn)到SecondaryActivity 3 * Author : 博客園-依舊淡然 4 */ 5 public void intentDemo_GoToSecondaryActivity() { 6 Intent intent_toSecondary = new Intent(); //創(chuàng)建一個意圖 7 intent_toSecondary.setClass(this, SecondaryActivity.class); //指定跳轉(zhuǎn)到SecondaryActivity 8 intent_toSecondary.putExtra("name", "jack"); //設(shè)置傳遞內(nèi)容name 9 intent_toSecondary.putExtra("age", 23); //設(shè)置傳遞內(nèi)容age 10 startActivity(intent_toSecondary); //啟動意圖 11 }那么,如何在SecondaryActivity中接收從MainActivity中傳過來的內(nèi)容(name、age)呢?下面的代碼給出了一種實現(xiàn)方案。
1 /* 2 * Function : 接收mainActivity中的intent_toSecondary 3 * Author : 博客園-依舊淡然 4 */ 5 public void acceptIntent() { 6 Intent intent_accept = getIntent(); //創(chuàng)建一個接收意圖 7 Bundle bundle = intent_accept.getExtras(); //創(chuàng)建Bundle對象,用于接收Intent數(shù)據(jù) 8 String name = bundle.getString("name"); //獲取Intent的內(nèi)容name 9 int age = bundle.getInt("age"); //獲取Intent的內(nèi)容age 10 }5.3發(fā)送一個帶回調(diào)方法的意圖
有時,我們可能需要通過定義在MainActivity中的某一控件來啟動SecondaryActivity,并且當(dāng)SecondaryActivity結(jié)束時,返給MainActivity一個執(zhí)行結(jié)果。
要實現(xiàn)上述的功能,只需要完成以下三步驟即可。
(1)在MainActivity中實現(xiàn)向SecondaryActivity發(fā)送帶請求碼的意圖,具體實現(xiàn)方法如下:
1 /* 2 * Function : 向SecondaryActivity發(fā)送帶請求碼的意圖 3 * Author : 博客園-依舊淡然 4 */ 5 public void intentDemo_request() { 6 Intent intent_request = new Intent(); //創(chuàng)建一個意圖 7 intent_request.setClass(this, SecondaryActivity.class); //指定跳轉(zhuǎn)到SecondaryActivity 8 startActivityForResult(intent_request, REQUEST_CODE); //啟動帶請求碼意圖 9 }(2)在SecondaryActivity中接收intent_request,并向意圖中填充要返給MainActivity的內(nèi)容,最后還需要設(shè)置一個返回碼。具體的實現(xiàn)方法如下:
1 /* 2 * Function : 接收mainActivity中的intent_request并返回一個結(jié)果碼 3 * Author : 博客園-依舊淡然 4 */ 5 public void acceptIntentAndReturn() { 6 Intent intent = getIntent(); //創(chuàng)建一個接收意圖 7 intent.putExtra("back", "data of SecondaryActivity"); //設(shè)置意圖的內(nèi)容 8 setResult(RESULT_CODE, intent); //設(shè)置結(jié)果碼 9 finish(); //結(jié)束SecondaryActivity,并返回MainActivity 10 }(3)當(dāng)結(jié)束SecondaryActivity時,程序?qū)⒎祷氐組ainActivity界面。此時,MainActivity中的onActivityResult()方法將被回調(diào),而我們要做的就是實現(xiàn)該方法。在本示例中,該方法的具體實現(xiàn)方法如下:
1 /* 2 * Function : onActivityResult回調(diào)方法 3 * Author : 博客園-依舊淡然 4 */ 5 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 6 if(requestCode == REQUEST_CODE && resultCode == SecondaryActivity.RESULT_CODE) { 7 Bundle bundle = data.getExtras(); 8 String str = bundle.getString("back"); 9 Toast.makeText(this, "從SecondaryActivity的返回值為:" + str, Toast.LENGTH_LONG).show(); 10 } 11 }以上的代碼,我們通過判斷requestCode和resultCode便可以唯一的確定MainActivity中的調(diào)用者和SecondaryActivity中的被調(diào)用者,建立起了一一對應(yīng)的關(guān)系。并且,我們通過Bundle對象獲取了從SecondaryActivity中返回給MainActivity的內(nèi)容,并通過Toast進行了輸出,如圖2所示。
圖2?從SecondaryActivity中返回的內(nèi)容
由圖2可見,從SecondaryActivity中返回的內(nèi)容正是我們在SecondaryActivity中定義的字符串“data?of?SecondaryActivity”。
6.總結(jié)
本篇博文主要介紹了Intent的相關(guān)概念,以及Intent在Activity中的三種使用方法。有關(guān)Intent在Service和Broadcast中的使用方法,將在后續(xù)的Service和Broadcast的學(xué)習(xí)過程中再做介紹。
?
作者:依舊淡然 郵箱:menlsh@163.com 博客:http://www.cnblogs.com/menlsh/ 本文版權(quán)歸作者所有,未經(jīng)作者同意,嚴(yán)禁轉(zhuǎn)載及用作商業(yè)傳播,否則將追究法律責(zé)任。總結(jié)
以上是生活随笔為你收集整理的【Android】Intent介绍及Intent在Activity中的使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android】Android适配器之
- 下一篇: 【Android】Android中Int