




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第第6章章 組件通信與廣播消息組件通信與廣播消息 本章學(xué)習(xí)目標n了解使用了解使用Intent進行組件通信的原理進行組件通信的原理n掌握使用掌握使用Intent啟動啟動Activity的方法的方法n掌握獲取掌握獲取Activity返回值的方法返回值的方法n了解了解Intent過濾器的原理與匹配機制過濾器的原理與匹配機制n掌握發(fā)送和接收廣播消息的方法掌握發(fā)送和接收廣播消息的方法6.1 Intent簡介 nIntent是是一個動作的完整描述,包含了動作的一個動作的完整描述,包含了動作的產(chǎn)生組件、接收組件和傳遞的數(shù)據(jù)信息產(chǎn)生組件、接收組件和傳遞的數(shù)據(jù)信息qIntent也可稱為一個在不同組件之間傳遞的消
2、息,這個也可稱為一個在不同組件之間傳遞的消息,這個消息在到達接收組件后,接收組件會執(zhí)行相關(guān)的動作消息在到達接收組件后,接收組件會執(zhí)行相關(guān)的動作q Intent為為Activity、Service和和BroadcastReceiver等等組件提供交互能力組件提供交互能力qIntent的用途的用途n啟動啟動Activity和和Servicen在在Android系統(tǒng)上發(fā)布廣播消息系統(tǒng)上發(fā)布廣播消息q廣播消息可以是接收到特定數(shù)據(jù)或消息,也可以是手機廣播消息可以是接收到特定數(shù)據(jù)或消息,也可以是手機的信號變化或電池的電量過低等信息的信號變化或電池的電量過低等信息6.1 Intent簡介n6.1.1 啟動A
3、ctivityq在在Android系統(tǒng)中,應(yīng)用程序一般都有多個系統(tǒng)中,應(yīng)用程序一般都有多個Activity,Intent可以實現(xiàn)不同可以實現(xiàn)不同Activity之間的切換和數(shù)據(jù)傳遞之間的切換和數(shù)據(jù)傳遞q啟動啟動Activity方式方式n顯式啟動,必須在顯式啟動,必須在Intent中指明啟動的中指明啟動的Activity所在的類所在的類n隱式啟動,隱式啟動, Android系統(tǒng)根據(jù)系統(tǒng)根據(jù)Intent的動作和數(shù)據(jù)來決定的動作和數(shù)據(jù)來決定啟動哪一個啟動哪一個Activity,也就是說在隱式啟動時,也就是說在隱式啟動時,Intent中中只包含需要執(zhí)行的動作和所包含的數(shù)據(jù),而無需指明具體只包含需要執(zhí)行
4、的動作和所包含的數(shù)據(jù),而無需指明具體啟動哪一個啟動哪一個Activity,選擇權(quán)由,選擇權(quán)由Android系統(tǒng)和最終用戶系統(tǒng)和最終用戶來決定來決定6.1 Intent簡介n6.1.1 啟動Activityq顯式啟動顯式啟動n使用使用Intent顯式啟動顯式啟動Activityn創(chuàng)建一個創(chuàng)建一個Intentn指定當(dāng)前的應(yīng)用程序上下文以及要啟動的指定當(dāng)前的應(yīng)用程序上下文以及要啟動的Activityn把創(chuàng)建好的這個把創(chuàng)建好的這個Intent作為參數(shù)傳遞給作為參數(shù)傳遞給startActivity()方法方法Intent intent = new Intent(IntentDemo.this, Acti
5、vityToStart.class);startActivity(intent);6.1 Intent簡介n6.1.1 啟動Activityq顯式啟動顯式啟動n下面用下面用IntentDemo示例說明如何使用示例說明如何使用Intent啟動新的啟動新的Activity。IntentDemo示例包含兩個示例包含兩個Activity,分別是,分別是IntentDemoActivity和和NewActivity。n程序默認啟動的程序默認啟動的Activity是是IntentDemo,在用戶點擊,在用戶點擊“啟動啟動Activity”按鈕后,程序啟動的按鈕后,程序啟動的Activity是是NewAct
6、ivity 6.1 Intent簡介n6.1.1 啟動Activityq顯式啟動n在在IntentDemo示例中使用了兩個示例中使用了兩個Activity,因此需要在,因此需要在AndroidManifest.xml文件中注冊這兩個文件中注冊這兩個Activity。注冊。注冊Activity應(yīng)使用應(yīng)使用標簽,嵌套在標簽,嵌套在標標簽內(nèi)部。簽內(nèi)部。6.1 Intent簡介n6.1.1 啟動Activity-顯式啟動nAndroidManifest.xml文件代碼如下 manifest xmlns:android=http:/ android:icon=drawable/icon android:
7、label=string/app_nameactivity category / activityuses-=14 /6.1 Intent簡介n6.1.1 啟動Activityq顯式啟動nAndroid應(yīng)用程序中,應(yīng)用程序中,用戶使用的每個組件都必須在用戶使用的每個組件都必須在AndroidManifest.xml文件中的文件中的節(jié)點節(jié)點內(nèi)定義。內(nèi)定義。在上面的代碼中,在上面的代碼中,節(jié)點下共節(jié)點下共有兩個有兩個節(jié)點,分別代表應(yīng)用程序中所使用節(jié)點,分別代表應(yīng)用程序中所使用的兩個的兩個Activity,IntentDemoActivity和和NewActivity。6.1 Intent簡介n6.
8、1.1 啟動Activityq顯式啟動n在IntentDemoActivity.java文件中,包含了使用Intent啟動Activity的核心代碼: Button Button buttonbutton = ( = (Button)findViewById(R.id.btnButton)findViewById(R.id.btn); );button.setOnClickListener(newbutton.setOnClickListener(new OnClickListenerOnClickListener()()public void public void onClick(View
9、onClick(View view) view)IntentIntent intentintent = new = new Intent(IntentDemoActivity.thisIntent(IntentDemoActivity.this, , NewActivity.classNewActivity.class); );startActivity(intentstartActivity(intent); ); ););6.1 Intent簡介n6.1.1 啟動Activityq顯式啟動n在點擊事件的處理函數(shù)中,在點擊事件的處理函數(shù)中,Intent構(gòu)造函數(shù)的第構(gòu)造函數(shù)的第1個參數(shù)個參數(shù)是
10、應(yīng)用程序上下文,在這里就是是應(yīng)用程序上下文,在這里就是IntentDemoActivity;第第2個參數(shù)是接收個參數(shù)是接收Intent的目標組件的目標組件,這里使用的是顯式,這里使用的是顯式啟動方式,直接指明了需要啟動的啟動方式,直接指明了需要啟動的Activity。6.1 Intent簡介n6.1.1 啟動Activityq隱式啟動n隱式啟動的好處在于不需要指明需要啟動哪一個Activity,而由Android系統(tǒng)來決定,這樣有利于降低組件之間的耦合度。n選擇隱式啟動Activity,Android系統(tǒng)會在程序運行時解析Intent,并根據(jù)一定的規(guī)則對Intent和Activity進行匹配,
11、使Intent上的動作、數(shù)據(jù)與Activity完全吻合。n匹配的組件可以是程序本身的Activity,也可以是Android系統(tǒng)內(nèi)置的Activity,還可以是第三方應(yīng)用程序提供的Activity。n因此,這種方式強調(diào)了Android組件的可復(fù)用性。 6.1 Intent簡介n6.1.1 啟動Activityq隱式啟動n如果程序開發(fā)人員希望啟動一個瀏覽器,查看指定如果程序開發(fā)人員希望啟動一個瀏覽器,查看指定的網(wǎng)頁內(nèi)容,卻不能確定具體應(yīng)該啟動哪一個的網(wǎng)頁內(nèi)容,卻不能確定具體應(yīng)該啟動哪一個Activity,此時則可以使用,此時則可以使用Intent的隱式啟動方式,的隱式啟動方式,由由Android
12、系統(tǒng)在系統(tǒng)在程序運行時決定具體啟動程序運行時決定具體啟動哪一個應(yīng)哪一個應(yīng)用程序的用程序的Activity來接收這個來接收這個Intent。n程序開發(fā)人員可以將瀏覽動作和程序開發(fā)人員可以將瀏覽動作和Web地址作為參數(shù)地址作為參數(shù)傳遞給傳遞給Intent,Android系統(tǒng)則通過匹配動作和數(shù)據(jù)系統(tǒng)則通過匹配動作和數(shù)據(jù)格式,找到最適合于此動作和數(shù)據(jù)格式的組件。格式,找到最適合于此動作和數(shù)據(jù)格式的組件。 Intent Intent intentintent = new = new Intent(Intent(Intent.ACTION_VIEWIntent.ACTION_VIEW, , Uri.par
13、se(http:/.hkUri.parse(http:/.hk);); startActivity(intentstartActivity(intent); );6.1 Intent簡介n6.1.1 啟動Activityq隱式啟動nIntent的動作是的動作是Intent.ACTION_VIEW,數(shù)據(jù)是,數(shù)據(jù)是Web地址,地址,使用使用Uri.parse(urlString)方法,可以簡單的把一個字符串方法,可以簡單的把一個字符串解釋成解釋成Uri對象。對象。Android系統(tǒng)在匹配系統(tǒng)在匹配Intent時,首先根據(jù)動時,首先根據(jù)動作作Intent.ACTION_VIEW,得知需要,得知需要啟
14、動具備瀏覽功能的啟動具備瀏覽功能的Activity,但具體是瀏覽電話號碼還是瀏覽網(wǎng)頁,還需要根,但具體是瀏覽電話號碼還是瀏覽網(wǎng)頁,還需要根據(jù)據(jù)URI的數(shù)據(jù)類型來做最后判斷。因為數(shù)據(jù)提供的是的數(shù)據(jù)類型來做最后判斷。因為數(shù)據(jù)提供的是Web地地址址http:/,所以最終可以判定,所以最終可以判定Intent需需要啟動具有網(wǎng)頁瀏覽功能的要啟動具有網(wǎng)頁瀏覽功能的Activity。在缺省情況下,。在缺省情況下,Android系統(tǒng)會調(diào)用內(nèi)置的系統(tǒng)會調(diào)用內(nèi)置的Web瀏覽器。瀏覽器。6.1 Intent簡介n6.1.1 啟動Activityq隱式啟動隱式啟動nIntent的語法如下:的語法如下: Intent
15、Intent intentintent = new = new Intent(Intent.ACTION_VIEWIntent(Intent.ACTION_VIEW, , Uri.parse(urlStringUri.parse(urlString););Intent構(gòu)造函數(shù)的第構(gòu)造函數(shù)的第1個參數(shù)是個參數(shù)是Intent需要執(zhí)行的需要執(zhí)行的動作,動作,Android系統(tǒng)支持的常見動作字符串常系統(tǒng)支持的常見動作字符串常量可以參考表。量可以參考表。第第2個參數(shù)是個參數(shù)是URI,表示需要傳遞的數(shù)據(jù)。,表示需要傳遞的數(shù)據(jù)。6.1.1 啟動Activity-隱式啟動隱式啟動動作動作說明說明ACTION_
16、ANSWER打開接聽電話的打開接聽電話的Activity,默認為,默認為Android內(nèi)置的撥號界面內(nèi)置的撥號界面ACTION_CALL打開撥號盤界面并撥打電話,使用打開撥號盤界面并撥打電話,使用Uri中的數(shù)字部分作為電話號碼中的數(shù)字部分作為電話號碼ACTION_DELETE打開一個打開一個Activity,對所提供的數(shù)據(jù)進行刪除操作,對所提供的數(shù)據(jù)進行刪除操作ACTION_DIALACTION_DIAL打開內(nèi)置撥號打開內(nèi)置撥號界面界面,顯示,顯示UriUri中提供的電話號碼中提供的電話號碼ACTION_EDITACTION_EDIT打開一個打開一個ActivityActivity,對所提供的
17、數(shù)據(jù)進行編輯操作,對所提供的數(shù)據(jù)進行編輯操作ACTION_INSERTACTION_INSERT打開一個打開一個ActivityActivity,在提供數(shù)據(jù)的當(dāng)前位置插入新項,在提供數(shù)據(jù)的當(dāng)前位置插入新項ACTION_PICKACTION_PICK啟動一個子啟動一個子ActivityActivity,從提供的數(shù)據(jù)列表中選取一項,從提供的數(shù)據(jù)列表中選取一項ACTION_SEARCHACTION_SEARCH啟動一個啟動一個ActivityActivity,執(zhí)行搜索動作,執(zhí)行搜索動作ACTION_SENDTOACTION_SENDTO啟動一個啟動一個ActivityActivity,向數(shù)據(jù)提供的聯(lián)
18、系人發(fā)送信息,向數(shù)據(jù)提供的聯(lián)系人發(fā)送信息ACTION_SENDACTION_SEND啟動一個可以發(fā)送數(shù)據(jù)的啟動一個可以發(fā)送數(shù)據(jù)的ActivityActivityACTION_VIEWACTION_VIEW最常用的動作,對以最常用的動作,對以UriUri方式傳送的數(shù)據(jù),根據(jù)方式傳送的數(shù)據(jù),根據(jù)UriUri協(xié)議部分以最佳協(xié)議部分以最佳方式啟動相應(yīng)的方式啟動相應(yīng)的ActivityActivity進行處理。對于進行處理。對于http:addresshttp:address將打開瀏將打開瀏覽器查看;對于覽器查看;對于tel:addresstel:address將打開撥號界面并呼叫指定的電話將打開撥號界面
19、并呼叫指定的電話號碼號碼ACTION_WEB_SEARCHACTION_WEB_SEARCH打開一個打開一個ActivityActivity,對提供的數(shù)據(jù)進行,對提供的數(shù)據(jù)進行WebWeb搜索搜索6.1 Intent簡介n6.1.1 啟動Activityq隱式啟動nWebViewIntentDemo示例說明了如何隱式啟動Activity,用戶界面6.1 Intent簡介n6.1.1 啟動Activityq隱式啟動n當(dāng)用戶在文本框中輸入Web地址后,通過點擊“瀏覽此URL”按鈕,程序根據(jù)用戶輸入的Web地址生成一個Intent,并以隱式啟動的方式調(diào)用Android內(nèi)置的Web瀏覽器,并打開指定的
20、Web頁面。本例輸入的Web地址http:/.hk,打開頁面后的效果如圖6.1 Intent簡介n6.1.2 獲取Activity返回值q在上一小節(jié)在上一小節(jié)IntentDemo示例中,通過示例中,通過startActivity(Intent)方法啟動方法啟動Activity,啟動后的啟動后的兩個兩個Activity之間相互獨立之間相互獨立,沒有任何的關(guān)聯(lián)。在,沒有任何的關(guān)聯(lián)。在很多情況下,后啟動的很多情況下,后啟動的Activity是為了讓用戶對特是為了讓用戶對特定信息進行選擇,在后啟動的定信息進行選擇,在后啟動的Activity關(guān)閉時,這關(guān)閉時,這些信息是需要返回給些信息是需要返回給先前啟
21、動的先前啟動的Activity。q后啟動的后啟動的Activity稱為稱為為為“子子Activity”,先啟動的,先啟動的Activity稱為稱為“父父Activity”。q如果需要將子如果需要將子Activity的信息返回給父的信息返回給父Activity,則則可以使用可以使用Sub-Activity的方式去啟動子的方式去啟動子Activity。 6.1 Intent簡介n6.1.2 獲取Activity返回值q獲取子獲取子Activity的返回值,一般可以分為以下三個步的返回值,一般可以分為以下三個步驟:驟:n以以Sub-Activity的方式啟動子的方式啟動子Activity;n設(shè)置子設(shè)
22、置子Activity的返回值;的返回值;n在父在父Activity中獲取返回值;中獲取返回值;n下面詳細介紹每一個步驟的過程和代碼實現(xiàn)。下面詳細介紹每一個步驟的過程和代碼實現(xiàn)。6.1 Intent簡介n6.1.2 獲取Activity返回值q以Sub-Activity的方式啟動子Activityn以以Sub-Activity方式啟動子方式啟動子Activity,需要調(diào)用需要調(diào)用startActivityForResult(Intent, requestCode)函數(shù)函數(shù)n參數(shù)參數(shù)Intent用于決定啟動哪個用于決定啟動哪個Activityn參數(shù)參數(shù)requestCode是是請求碼請求碼。n因為
23、所有因為所有子子Activity返回時返回時,父,父Activity都調(diào)用相同的都調(diào)用相同的處理函數(shù),因此父處理函數(shù),因此父Activity使用使用requestCode來確定數(shù)來確定數(shù)據(jù)是哪一個子據(jù)是哪一個子Activity返回的返回的6.1 Intent簡介n6.1.2 獲取獲取Activity返回值返回值q以以Sub-Activity的方式啟動子的方式啟動子Activityn顯式啟動子顯式啟動子Activity的代碼如下的代碼如下 n隱式啟動子隱式啟動子Activity的代碼如下的代碼如下 intint SUBACTIVITY1 = 1; SUBACTIVITY1 = 1; Intent
24、 Intent intentintent = new = new Intent(thisIntent(this, , SubActivity1.class);SubActivity1.class); startActivityForResult(intentstartActivityForResult(intent, , SUBACTIVITY1);SUBACTIVITY1); int SUBACTIVITY2 = 2; Uri uri = Uri.parse(content:/contacts/people); Intent intent = new Intent(Intent.ACTION
25、_PICK(Intent.ACTION_PICK, uri); startActivityForResult(intent, SUBACTIVITY2);6.1 Intent簡介n6.1.2 獲取Activity返回值q設(shè)置子Activity的返回值n在子在子Activity調(diào)用調(diào)用finish()函數(shù)關(guān)閉前,調(diào)用函數(shù)關(guān)閉前,調(diào)用setResult()函函數(shù)設(shè)定需要返回給父數(shù)設(shè)定需要返回給父Activity的數(shù)據(jù)。的數(shù)據(jù)。nsetResult()函數(shù)有兩個參數(shù),函數(shù)有兩個參數(shù),n一個是結(jié)果碼,一個是返回值。一個是結(jié)果碼,一個是返回值。n結(jié)果碼表明了子結(jié)果碼表明了子Activity的返回狀態(tài),通
26、常為的返回狀態(tài),通常為Activity.RESULT_OK(正常返回數(shù)據(jù))或者(正常返回數(shù)據(jù))或者Activity.RESULT_CANCELED(取消返回數(shù)據(jù)),也可(取消返回數(shù)據(jù)),也可以是自定義的結(jié)果碼,結(jié)果碼均為整數(shù)類型。以是自定義的結(jié)果碼,結(jié)果碼均為整數(shù)類型。n返回值封裝在返回值封裝在Intent中,也就是說子中,也就是說子Activity通過通過Intent將將需要返回的數(shù)據(jù)傳遞給父需要返回的數(shù)據(jù)傳遞給父Activity。數(shù)據(jù)主要以。數(shù)據(jù)主要以Uri形式返形式返回給父回給父Activity,此外還可以附加一些額外信息,這些額,此外還可以附加一些額外信息,這些額外信息用外信息用Ext
27、ra的集合表示。的集合表示。 6.1 Intent簡介n6.1.2 獲取Activity返回值q設(shè)置子Activity的返回值n以下代碼說明如何在子Activity中設(shè)置返回值: Uri data = Uri data = Uri.parse(telUri.parse(tel: + : + tel_numbertel_number); ); Intent result = new Intent result = new Intent(nullIntent(null, , data);data); result.result.putExtraputExtra(address(address, J
28、D , JD Street);Street); setResult(RESULT_OKsetResult(RESULT_OK, result);, result); finish();finish();6.1 Intent簡介n6.1.2 獲取Activity返回值q在父在父Activity中獲取返回值中獲取返回值n當(dāng)子當(dāng)子Activity關(guān)閉后,父關(guān)閉后,父Activity會調(diào)用會調(diào)用onActivityResult()函數(shù),用了函數(shù),用了獲取子獲取子Activity的返回值。的返回值。n如果需要在父如果需要在父Activity中處理子中處理子Activity的返回值,則重載此函數(shù)即可的返回
29、值,則重載此函數(shù)即可。nonActivityResult()函數(shù)的語法如下:函數(shù)的語法如下: n其中第其中第1個參數(shù)個參數(shù)requestCode是請求碼,用來判斷第是請求碼,用來判斷第3個參數(shù)是哪一個個參數(shù)是哪一個子子Activity的返回值;的返回值;resultCode用于表示子用于表示子Activity的數(shù)據(jù)返回狀態(tài)的數(shù)據(jù)返回狀態(tài);Data是子是子Activity的返回數(shù)據(jù),返回數(shù)據(jù)類型是的返回數(shù)據(jù),返回數(shù)據(jù)類型是Intent。根據(jù)返回數(shù)。根據(jù)返回數(shù)據(jù)的用途不同,據(jù)的用途不同,Uri數(shù)據(jù)的協(xié)議則不同,也可以使用數(shù)據(jù)的協(xié)議則不同,也可以使用Extra方法返回一些方法返回一些原始類型的數(shù)據(jù)。
30、原始類型的數(shù)據(jù)。 public void public void onActivityResult(intonActivityResult(int requestCoderequestCode, , intint resultCoderesultCode, Intent data);, Intent data);6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值n以下代碼說明如何在父Activity中處理子Activity的返回值:private static final private static final intint SUBACTIVI
31、TY1 = 1; SUBACTIVITY1 = 1;private static final private static final intint SUBACTIVITY2 = 2; SUBACTIVITY2 = 2;Override Override public void public void onActivityResultonActivityResult(int(int requestCoderequestCode, , intint resultCoderesultCode, Intent data), Intent data)super.onActivityResult(req
32、uestCodesuper.onActivityResult(requestCode, , resultCoderesultCode, data);, data);switch(requestCodeswitch(requestCode) )case SUBACTIVITY1:case SUBACTIVITY1:if (if (resultCoderesultCode = = Activity.RESULT_OKActivity.RESULT_OK) )Uri Uri uriDatauriData = = data.getDatadata.getData();();else if (else
33、if (resultCoderesultCode = = Activity.RESULT_CANCELActivity.RESULT_CANCEL) ) break;break;case SUBACTIVITY2:case SUBACTIVITY2:if (if (resultCoderesultCode = = Activity.RESULT_OKActivity.RESULT_OK) )Uri Uri uriDatauriData = = data.getDatadata.getData();(); break;break; 6.1 Intent簡介n6.1.2 獲取Activity返回值
34、q在父Activity中獲取返回值n代碼的第1行和第2行是兩個子Activity的請求碼,在第7行對請求碼進行匹配。n代碼第9行和第11行對結(jié)果碼進行判斷,如果返回的結(jié)果碼是Activity.RESULT_OK,則在代碼的第10行使用getData()函數(shù)獲取Intent中的Uri數(shù)據(jù);n如果返回的結(jié)果碼是Activity.RESULT_CANCELED,則放棄所有操作。6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值nActivityCommunication示例說明了如何以Sub-Activity方式啟動子Activity,以及如何使用In
35、tent進行組件間通信。6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值n當(dāng)用戶點擊“啟動Activity1”和“啟動Activity2”按鈕時,程序?qū)⒎謩e啟動子SubActivity1和SubActivity2。6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值nSubActivity1提供了一個輸入框,以及提供了一個輸入框,以及“接受接受”和和“撤撤銷銷”兩個按鈕。如果在輸入框中輸入信息后點擊兩個按鈕。如果在輸入框中輸入信息后點擊“接受接受”按鈕,程序會把輸入框中的信息傳遞給其父按鈕,程序會把
36、輸入框中的信息傳遞給其父Activity,并,并在父在父Activity的界面上顯示。的界面上顯示。n如果用戶點擊如果用戶點擊“撤銷撤銷”按鈕,則程序不會向父按鈕,則程序不會向父Activity傳傳遞任何信息。遞任何信息。nSubActivity2主要是為了說明如何在父主要是為了說明如何在父Activity中處理多中處理多個子個子Activity,因此僅提供了用于關(guān)閉,因此僅提供了用于關(guān)閉SubActivity2的的“關(guān)閉關(guān)閉”按鈕。按鈕。 6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值nActivityCommunication示例的文件結(jié)
37、構(gòu)q父Activity的代碼在ActivityCommunication.java文件中,界面布局在main.xml中;兩個子Activity的代碼分別在SubActivity1.java和SubActivity2.java文件中,界面布局分別在subactivity1.xml和subactivity2.xml中。 6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值nActivityCommunicationActivity.java文件的核心代碼如下1public class ActivityCommunicationActivity exte
38、nds Activity 2private static final int SUBACTIVITY1 = 1;3private static final int SUBACTIVITY2 = 2;4TextView textView;5Override6public void onCreate(Bundle savedInstanceState) 7super.onCreate(savedInstanceState);8setContentView(R.layout.main);9textView = (TextView)findViewById(R.id.textShow);10final
39、 Button btn1 = (Button)findViewById(R.id.btn1);11final Button btn2 = (Button)findViewById(R.id.btn2);12 13btn1.setOnClickListener(new OnClickListener()14public void onClick(View view)15Intent intent = new Intent(ActivityCommunication.this, SubActivity1.class);16startActivityForResult(intent, SUBACTI
40、VITY1);176.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值18);1920btn2.setOnClickListener(new OnClickListener()21public void onClick(View view)22Intent intent = new Intent(ActivityCommunication.this, SubActivity2.class);23startActivityForResult(intent, SUBACTIVITY2);2425);262728Override29protected v
41、oid onActivityResult(int requestCode, int resultCode, Intent data) 30super.onActivityResult(requestCode, resultCode, data);316.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值32switch(requestCode)33case SUBACTIVITY1:34if (resultCode = RESULT_OK)35Uri uriData = data.getData();36textView.setText(uriDat
42、a.toString();3738break;39case SUBACTIVITY2:40break;41nn436.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值n在代碼的第2行和第3行分別定義了兩個子Activity的請求碼。碼。n在代碼的第在代碼的第16行和第行和第23行以行以Sub-Activity的方式分別啟的方式分別啟動兩個子動兩個子Activity。n代碼第代碼第29行是子行是子Activity關(guān)閉后的返回值處理函數(shù),其中關(guān)閉后的返回值處理函數(shù),其中requestCode是子是子Activity返回的請求碼,與第返回的請求碼,與第2
43、行和第行和第3行定義的兩個請求碼相匹配;行定義的兩個請求碼相匹配;resultCode是結(jié)果碼,是結(jié)果碼,n在代碼第在代碼第32行對結(jié)果碼進行判斷,如果等于行對結(jié)果碼進行判斷,如果等于RESULT_OK,在第,在第35行代碼獲取子行代碼獲取子Activity返回值中的返回值中的數(shù)據(jù);數(shù)據(jù);data是返回值,子是返回值,子Activity需要返回的數(shù)據(jù)就保存需要返回的數(shù)據(jù)就保存在在data中。中。 6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值nSubActivity1.java的核心代碼如下:public class SubActivity1
44、 extends Activity public class SubActivity1 extends Activity OverrideOverridepublic void public void onCreate(BundleonCreate(Bundle savedInstanceStatesavedInstanceState) ) super.onCreate(savedInstanceStatesuper.onCreate(savedInstanceState); );setContentView(R.layout.subactivity1);setContentView(R.la
45、yout.subactivity1);final final EditTextEditText editTexteditText = ( = (EditText)findViewById(R.id.editEditText)findViewById(R.id.edit); );Button Button btnOKbtnOK = ( = (Button)findViewById(R.id.btn_okButton)findViewById(R.id.btn_ok); );Button Button btnCancelbtnCancel = ( = (Button)findViewById(R.
46、id.btn_cancelButton)findViewById(R.id.btn_cancel); );btnOK.setOnClickListener(btnOK.setOnClickListener(newnew OnClickListenerOnClickListener()()public void public void onClick(ViewonClick(View view) view)String String uriStringuriString = = editText.getText().toStringeditText.getText().toString();()
47、;Uri data = Uri data = Uri.parse(uriStringUri.parse(uriString); );Intent result = new Intent result = new Intent(nullIntent(null, data);, data);setResult(RESULT_OKsetResult(RESULT_OK, result);, result);finish();finish(); ););btnCancel.setOnClickListener(newbtnCancel.setOnClickListener(new OnClickLis
48、tenerOnClickListener()()public void public void onClick(ViewonClick(View view) view)setResult(RESULT_CANCELEDsetResult(RESULT_CANCELED, null);, null);finish();finish(); );); 6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值n代碼第13行將EditText控件的內(nèi)容作為數(shù)據(jù)保存在Uri中,并在第14行代碼中構(gòu)造Intent。n在第15行代碼中,RESUIT_OK作為結(jié)果碼,通
49、過調(diào)用setResult()函數(shù),將result設(shè)定為返回值。n最后在代碼第16行調(diào)用finish()函數(shù)關(guān)閉當(dāng)前的子Activity6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值nSubActivity2.java的核心代碼:public class SubActivity2 extends Activity public class SubActivity2 extends Activity OverrideOverridepublic void public void onCreate(BundleonCreate(Bundle sav
50、edInstanceStatesavedInstanceState) ) super.onCreate(savedInstanceStatesuper.onCreate(savedInstanceState); );setContentView(R.layout.subactivity2);setContentView(R.layout.subactivity2); Button Button btnReturnbtnReturn = ( = (Button)findViewById(R.id.btn_returnButton)findViewById(R.id.btn_return); );
51、btnReturn.setOnClickListener(newbtnReturn.setOnClickListener(new OnClickListenerOnClickListener()()public void public void onClick(ViewonClick(View view) view)setResult(RESULT_CANCELEDsetResult(RESULT_CANCELED, null);, null);finish();finish(); );); 6.1 Intent簡介n6.1.2 獲取Activity返回值q在父Activity中獲取返回值n在
52、SubActivity2的代碼中,第10行的setResult()函數(shù)僅設(shè)置了結(jié)果碼,第2個參數(shù)為null,表示沒有數(shù)據(jù)需要傳遞給父Activity。6.2 Intent過濾器nIntent解析q隱式啟動隱式啟動Activity時,并沒有在時,并沒有在Intent中指明中指明Activity所在的類,因此,所在的類,因此,Android系統(tǒng)一定存在系統(tǒng)一定存在某種匹配機制,使某種匹配機制,使Android系統(tǒng)能夠根據(jù)系統(tǒng)能夠根據(jù)Intent中中的數(shù)據(jù)信息,找到需要啟動的的數(shù)據(jù)信息,找到需要啟動的Activity。這種。這種匹配匹配機制是依靠機制是依靠Android系統(tǒng)中的系統(tǒng)中的Intent過
53、濾器(過濾器(Intent Filter)來實現(xiàn)的。來實現(xiàn)的。6.2 Intent過濾器nIntent解析qIntent過濾器是一種根據(jù)過濾器是一種根據(jù)Intent中的動作(中的動作(Action)、類別()、類別(Category)和數(shù)據(jù)()和數(shù)據(jù)(Data)等內(nèi)容,)等內(nèi)容,對適合接收該對適合接收該Intent的組件進行匹配和篩選的機制的組件進行匹配和篩選的機制。Intent過濾器可以匹配數(shù)據(jù)類型、路徑和協(xié)議,還可以確定多個匹配項順序的優(yōu)先級(Priority)。應(yīng)用程序的Activity、Service和BroadcastReceiver組件都可以注冊Intent過濾器。這樣,這些組件在
54、特定的數(shù)據(jù)格式上則可以產(chǎn)生相應(yīng)的動作。 6.2 Intent過濾器nIntent解析q為了使組件能夠注冊Intent過濾器,通常在AndroidManifest.xml文件的各個組件下定義節(jié)點,然后在節(jié)點中聲明該組件所支持的動作、執(zhí)行的環(huán)境和數(shù)據(jù)格式等信息。當(dāng)然,也可以在程序代碼中動態(tài)地為組件設(shè)置Intent過濾器。節(jié)點支持節(jié)點支持標簽、標簽、標簽和標簽和標簽,標簽,分別用來定義Intent過濾器的“動作”、“類別”和“數(shù)據(jù)”。節(jié)點支持的標簽和屬性說明參考表 6.2 Intent過濾器標簽標簽屬性屬性說明說明android:nameandroid:name指定組件所能響應(yīng)的動作,用字符串表示,
55、指定組件所能響應(yīng)的動作,用字符串表示,通常由通常由JavaJava類名和包的完全限定名構(gòu)成類名和包的完全限定名構(gòu)成category android:categoryandroid:category指定以何種方式去服務(wù)指定以何種方式去服務(wù)IntentIntent請求的動作請求的動作Android:hostAndroid:host指定一個有效的主機名指定一個有效的主機名android:mimetypeandroid:mimetype指定組件能處理的數(shù)據(jù)類型指定組件能處理的數(shù)據(jù)類型android:pathandroid:path有效的有效的URIURI路徑名路徑名android:portandroi
56、d:port主機的有效端口號主機的有效端口號android:schemeandroid:scheme所需要的特定協(xié)議所需要的特定協(xié)議6.2 Intent過濾器nIntent解析q標簽用來指定標簽用來指定Intent過濾器的服務(wù)方式過濾器的服務(wù)方式,每個,每個Intent過濾器可以定義多個過濾器可以定義多個標簽標簽,程序開發(fā)人員可以使用自定義的類別,或使用,程序開發(fā)人員可以使用自定義的類別,或使用Android系統(tǒng)提供的類別。系統(tǒng)提供的類別。Android系統(tǒng)提供的類系統(tǒng)提供的類別可以參考表別可以參考表 6.2 Intent過濾器值值說明說明ALTERNATIVEIntent數(shù)據(jù)默認動作的一個可
57、替換的執(zhí)行方法SELECTED_ALTERNATIVE 和ALTERNATIVE類似,但替換的執(zhí)行方法不是指定的,而是被解析出來的BROWSABLE聲明Activity可以由瀏覽器啟動DEFAULTDEFAULT為Intent過濾器中定義的數(shù)據(jù)提供默認動作HOME設(shè)備啟動后顯示的第一個ActivityLAUNCHERLAUNCHER在應(yīng)用程序啟動時首先被顯示在應(yīng)用程序啟動時首先被顯示6.2 Intent過濾器nIntent解析q這種Intent到Intent過濾器的映射過程稱為“Intent解析”。Intent解析可以在所有的組件中,找到一個可以與請求的Intent達成最佳匹配的Intent過
58、濾器。Android系統(tǒng)中Intent解析的匹配規(guī)則如下: 6.2 Intent過濾器nIntent解析解析q(1) Android系統(tǒng)把所有應(yīng)用程序包中的系統(tǒng)把所有應(yīng)用程序包中的Intent過濾器集合在一過濾器集合在一起,形成一個完整的起,形成一個完整的Intent過濾器列表。過濾器列表。q(2) 在在Intent與與Intent過濾器進行匹配時,過濾器進行匹配時,Android系統(tǒng)會將列系統(tǒng)會將列表中所有表中所有Intent過濾器的過濾器的“動作動作”和和“類別類別”與與Intent進行匹配,進行匹配,任何不匹配的任何不匹配的Intent過濾器都將被過濾掉。沒有指定過濾器都將被過濾掉。沒有
59、指定“動作動作”的的Intent過濾器可以匹配任何的過濾器可以匹配任何的Intent,但是沒有指定,但是沒有指定“類別類別”的的Intent過濾器只能匹配沒有過濾器只能匹配沒有“類別類別”的的Intent。q(3) 把把Intent數(shù)據(jù)數(shù)據(jù)Uri的每個子部與的每個子部與Intent過濾器的過濾器的標簽中標簽中的屬性進行匹配,如果的屬性進行匹配,如果標簽指定了協(xié)議、主機名、路徑名標簽指定了協(xié)議、主機名、路徑名或或MIME類型,那么這些屬性都要與類型,那么這些屬性都要與Intent的的Uri數(shù)據(jù)部分進行匹配數(shù)據(jù)部分進行匹配,任何不匹配的,任何不匹配的Intent過濾器均被過濾掉。過濾器均被過濾掉。
60、q(4) 如果如果Intent過濾器的匹配結(jié)果多于一個,則可以根據(jù)在過濾器的匹配結(jié)果多于一個,則可以根據(jù)在標簽中定義的優(yōu)先級標簽來對標簽中定義的優(yōu)先級標簽來對Intent過濾器進行排過濾器進行排序,優(yōu)先級最高的序,優(yōu)先級最高的Intent過濾器將被選擇。過濾器將被選擇。qIntentResolutionDemo示例說明了如何在示例說明了如何在AndroidManifest.xml文件中注冊文件中注冊Intent過濾器,以及如何設(shè)置過濾器,以及如何設(shè)置節(jié)點屬性節(jié)點屬性來捕獲指定的來捕獲指定的Intent。 6.2 Intent過濾器nIntent解析qAndroidManifest.xml的完整
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鎮(zhèn)江糧食加工機械項目招商引資報告
- LED照明項目可行性研究報告
- 2025年中國一次性無菌帽市場深度調(diào)查評估及投資方向研究報告
- 2025年四氟制品液壓機項目投資可行性研究分析報告
- 12 我的環(huán)保小搭檔 教學(xué)設(shè)計-2023-2024學(xué)年道德與法治二年級下冊統(tǒng)編版
- 2025年男式手套項目投資可行性研究分析報告
- 2025年度房產(chǎn)租賃合同附租賃房產(chǎn)租賃期間租金調(diào)整協(xié)議
- 11呼吸 教學(xué)設(shè)計-2023-2024學(xué)年冀人版(2017)科學(xué)四年級下冊
- 2025年度吊車租賃及現(xiàn)場安全監(jiān)督合同
- 2025年廠房出租合同及租賃雙方爭議解決機制
- 人教版(2025版)七年級下冊英語UNIT 1 Animal Friends 單元整體教學(xué)設(shè)計(6個課時)
- 項目管理知識手冊指南
- 2025年常熟市招聘進村人員歷年高頻重點提升(共500題)附帶答案詳解
- (主城一診)重慶市2025年高2025屆高三學(xué)業(yè)質(zhì)量調(diào)研抽測 (第一次)物理試卷(含答案)
- 2025年中國電信集團有限公司招聘筆試參考題庫含答案解析
- DB50T 393-2011 城市三維建模技術(shù)規(guī)范
- 《肺癌圍手術(shù)期護理》課件
- 《糖尿病足護理查房》課件
- 山東省臨沂市地圖矢量課件模板()
- 2024復(fù)工復(fù)產(chǎn)安全培訓(xùn)
評論
0/150
提交評論