Android應(yīng)用程序開發(fā) 課件 第4章 Android組件紐帶-Intent_第1頁(yè)
Android應(yīng)用程序開發(fā) 課件 第4章 Android組件紐帶-Intent_第2頁(yè)
Android應(yīng)用程序開發(fā) 課件 第4章 Android組件紐帶-Intent_第3頁(yè)
Android應(yīng)用程序開發(fā) 課件 第4章 Android組件紐帶-Intent_第4頁(yè)
Android應(yīng)用程序開發(fā) 課件 第4章 Android組件紐帶-Intent_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章Android核心組件—Intent本章簡(jiǎn)介一個(gè)Intent就是對(duì)一次即將進(jìn)行操作的抽象描述,它封裝了Android應(yīng)用的啟動(dòng)“意圖”。使用Intent傳播動(dòng)作是Android應(yīng)用的基本設(shè)計(jì)理念。Intent不僅既能夠有效降低應(yīng)用組件間的代碼耦合,還是應(yīng)用組件間通信的重要媒介。本章將在對(duì)Intent基本概念進(jìn)行介紹的基礎(chǔ)上,重點(diǎn)為讀者講解Intent的結(jié)構(gòu)、類型和使用方法。本章目錄4.1Intent概述4.2Intent的功能4.3Intent的屬性4.4Intent對(duì)象解析4.5小結(jié)4.6習(xí)題4.1Intent概述Intent是一種利用消息進(jìn)行交互的機(jī)制。Intent對(duì)象描述了應(yīng)用中一次操作的動(dòng)作、動(dòng)作涉及的數(shù)據(jù)及其附加信息。用戶可以使用Intent在Android設(shè)備上的應(yīng)用程序或組件之間傳遞交互信息,具體有如下3種形式:(1)通過調(diào)用startActivity()方法傳入一個(gè)Intent對(duì)象,啟動(dòng)新的Activity。(2)通過broadcastIntent機(jī)制將一個(gè)Intent發(fā)送給任何對(duì)該Intent感興趣的BoadcastReceiver。(3)通過調(diào)用startService()或bindService()方法與后臺(tái)Service進(jìn)行交互。此外,Android系統(tǒng)還能通過廣播Intent通知發(fā)生的系統(tǒng)事件。例如,無線網(wǎng)絡(luò)連接狀態(tài)的變化、來電或電池電量信息等。使用Intent傳播動(dòng)作是Android應(yīng)用的基本設(shè)計(jì)理念。4.2Intent的功能Intent消息是一種同一或不同應(yīng)用程序中的組件之間延遲運(yùn)行時(shí)綁定的機(jī)制。Android系統(tǒng)會(huì)根據(jù)Intent對(duì)動(dòng)作的描述查找到相應(yīng)組件,將Intent傳遞給調(diào)用的組件,并完成對(duì)組件的調(diào)用。Android應(yīng)用程序的三個(gè)核心組件是Activity、Services和BroadcastReceiver。在Android應(yīng)用開發(fā)中,Intent對(duì)象為啟動(dòng)這些組件提供了一致的操作方式。下表給出了Intent啟動(dòng)核心組件的典型方法。Intent啟動(dòng)核心組件的典型方法組件名啟動(dòng)方法功能ActivitystartActivity()startActivityForResult()啟動(dòng)新的ActivityServicesstartService()啟動(dòng)新的ServiceBroadcastReceiversendBroadcast()sendOrderedBroadcast()sendStickyBroadcast()sendStickyOrderedBroadcast()向BroadcastReceiver發(fā)送消息4.3Intent的屬性一個(gè)Intent對(duì)象就是一組信息,它代表了應(yīng)用組件的啟動(dòng)"意圖",Android系統(tǒng)會(huì)根據(jù)Intent對(duì)象的屬性配置來啟動(dòng)目標(biāo)組件。Intent的屬性主要有Component、Action、Category、Data、Extra和Flag六種,可使用Intent.setXXX()方法為Intent對(duì)象設(shè)置相應(yīng)屬性。4.3.1Component屬性Component屬性用于指定目標(biāo)組件的類型信息。在Android應(yīng)用開發(fā)時(shí),既可使用Intent.setComponent()方法利用目標(biāo)組件類名對(duì)該屬性值進(jìn)行設(shè)置,也可以使用Intent.setClass()方法利用目標(biāo)組件對(duì)象信息對(duì)該屬性值進(jìn)行設(shè)置。通常Android系統(tǒng)會(huì)根據(jù)Intent中包含的其它屬性信息(例如:Action、Data和Category等屬性)來查找目標(biāo)組件。而一旦指定了Component屬性,Android系統(tǒng)就能夠唯一地確定啟動(dòng)的目標(biāo)組件,不再執(zhí)行對(duì)目標(biāo)組件的查找。已指定Component屬性的Intent具有明確的啟動(dòng)組件,稱作顯式Intent。沒有指定Component屬性的Intent稱作是隱式Intent。4.3.1Component屬性下面給出應(yīng)用示例4-1,說明Component屬性的使用方法。該應(yīng)用程序包含兩個(gè)Activity:MainActivity和SecondActivity。圖4-1是MainActivity,它的界面只有一個(gè)按鈕,單擊該按鈕后將創(chuàng)建一個(gè)顯式Intent,以啟動(dòng)SecondActivity。SecondActivity啟動(dòng)后,將使用文本框顯示Component屬性中指定的目標(biāo)包名和類名,如圖4-2所示。4.3.1Component屬性圖4-1MainActivity 圖4-2SecondActivity在項(xiàng)目視圖中,雙擊打開“MainActivity.java”文件,找到onCreate(...)方法,添加如下代碼:

protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbtn=(Button)findViewById(R.id.Jumpbtn);btn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewarg0){//構(gòu)造一個(gè)ComponentName對(duì)象ComponentNamecomp=newComponentName(MainActivity.this,SecondActivity.class);Intentintent=newIntent();//為Intent設(shè)置Component屬性intent.setComponent(comp);startActivity(intent);}});}代碼解釋:Component屬性的創(chuàng)建和指定方法用粗體字標(biāo)記的代碼段表示??上雀鶕?jù)目標(biāo)組件的類名構(gòu)造出ComponentName對(duì)象;再使用Intent.setComponent()方法為Intent對(duì)象設(shè)置Component屬性。這樣,應(yīng)用程序就可以根據(jù)Intent對(duì)象的“意圖”啟動(dòng)目標(biāo)組件。當(dāng)應(yīng)用程序通過Component屬性為Intent對(duì)象指定被啟動(dòng)的目標(biāo)組件后,無需再在AndroidManifest.xml文件中為目標(biāo)組件配置<intent-filter>標(biāo)簽即可啟動(dòng)目標(biāo)組件。在項(xiàng)目視圖中,雙擊打開“SecondActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);

EditTextshow=(EditText)findViewById(R.id.Componentshow);//獲取啟動(dòng)該Activity的Intent對(duì)象的Component屬性ComponentNamecomp=getIntent().getComponent();//顯示Component屬性的包名和類名show.setText("目標(biāo)組件包名:"+comp.getPackageName()+"\n目標(biāo)組件類名:"+comp.getClassName());}代碼解釋:Intent中Component屬性的獲取方法用粗體字標(biāo)記的代碼段表示。可使用Intent.getComponent()方法獲取Intent對(duì)象中指定的Component屬性;再使用ComponentName.getPackageName()和ComponentName.getClassName()方法取出Component屬性的包名和類名。這樣,便可以在SecondActivity的文本框中顯示出Intent的Component屬性信息。編譯并運(yùn)行程序,點(diǎn)擊MainActivity中的按鈕啟動(dòng)SecondActivity,啟動(dòng)后SecondActivity見圖4-2。4.3.2Action屬性Action屬性用于指明Intent需要執(zhí)行的具體動(dòng)作。為實(shí)現(xiàn)Intent對(duì)象與目標(biāo)組件最大程度的解耦,Action屬性只規(guī)定出要執(zhí)行的動(dòng)作名稱,而不指明具體的目標(biāo)組件。以Android提供的標(biāo)準(zhǔn)Action屬性——ACTION_VIEW為例,該屬性只表示出一種抽象的內(nèi)容顯示操作,它既不限制啟動(dòng)應(yīng)哪一個(gè)Activity來顯示內(nèi)容,也不限制其具體顯示內(nèi)容。如果某一個(gè)Activity希望響應(yīng)特定Intent設(shè)置的動(dòng)作,僅需在AndroidManifest.xml文件內(nèi)找到標(biāo)識(shí)該Activity的標(biāo)簽,為其增加<intent-filter>和<action>子標(biāo)簽,并在<action>子標(biāo)簽中將其屬性值設(shè)置為與Intent的Action屬性值相同。4.3.3Category屬性下面給出應(yīng)用示例4-2,說明Action屬性的使用方法。該應(yīng)用程序包含兩個(gè)Activity:MainActivity和SecondActivity。圖4-3是MainActivity,它的界面只有一個(gè)按鈕,單擊該按鈕后將創(chuàng)建一個(gè)Intent,并為其設(shè)置Action屬性值,以啟動(dòng)SecondActivity。SecondActivity啟動(dòng)后,將使用文本框顯示Action屬性值,如圖4-4所示。圖4-3MainActivity 圖4-4SecondActivity在項(xiàng)目視圖中,雙擊打開“MainActivity.java”文件,為MainActivity添加字符串常量START_ACTION,然后找到onCreate(...)方法,添加如下代碼:

publicfinalstaticStringSTART_ACTION="com.example.actiontest.ACTIVITY_ACTION";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

Buttonbtn=(Button)findViewById(R.id.actionbtn);

btn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewarg0){//創(chuàng)建Intent對(duì)象Intentintent=newIntent();//為Intent設(shè)置Action屬性

intent.setAction(START_ACTION);startActivity(intent);}});}}

代碼解釋:Action屬性的指定方法用粗體字標(biāo)記的代碼段表示。可先根據(jù)Intent需要執(zhí)行的具體動(dòng)作為該動(dòng)作定義一個(gè)常量名;再使用Intent.setAction()方法為Intent對(duì)象設(shè)置Action屬性。這樣,應(yīng)用程序就可以根據(jù)Intent對(duì)象的“意圖”啟動(dòng)目標(biāo)組件。但是,該Intent對(duì)象并未明確指定要啟動(dòng)的目標(biāo)Activity。為了啟動(dòng)SecondActivity,打開AndroidManifest.xml文件,找到標(biāo)記SecondActivity的<activity>標(biāo)簽,添加下述代碼:

<activityandroid:name=".SecondActivity"android:label="SecondActivity">

<intent-filter><actionandroid:name="com.example.actiontest.ACTIVITY_ACTION"/><categoryandroid:name="ent.category.DEFAULT"/></intent-filter></activity>代碼解釋:粗體字標(biāo)記的代碼段為SecondActivity配置了<intent-filter>標(biāo)簽,以過濾出與啟動(dòng)該Activity有關(guān)的Intent。<intent-filter>標(biāo)簽下的<action>和<category>子標(biāo)簽則用于聲明相關(guān)Intent的Action屬性值和Category屬性值。只有當(dāng)這兩個(gè)子標(biāo)簽的屬性值與Intent對(duì)象中設(shè)置的屬性值都相同時(shí),目標(biāo)Activity才能被Android啟動(dòng)。

值得注意的是,Intent默認(rèn)的Category屬性值為CATEGORY_DEFAULT(字符串常量)。因此,如果在創(chuàng)建Intent對(duì)象時(shí)未設(shè)置Category屬性值,就需要在目標(biāo)組件中將<category>標(biāo)簽中配置為CATEGORY_DEFAULT。此外,一個(gè)Intent對(duì)象最多只能設(shè)置一個(gè)Action屬性,但是可以設(shè)置多個(gè)Category屬性。

最后,在項(xiàng)目視圖中,雙擊打開“SecondActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);

TextViewshow=(TextView)findViewById(R.id.showaction);//獲取啟動(dòng)該Activity的Intent的Action屬性值

Stringaction=getIntent().getAction();//顯示Action屬性值show.setText("Action屬性值:"+action);}

代碼解釋:Intent中Action屬性的獲取方法用粗體字標(biāo)記的代碼段表示。可使用Intent.getAction()方法獲取Intent對(duì)象中指定的Action屬性;這樣,便可以在SecondActivity的文本框中顯示出Intent的Action屬性信息。編譯并運(yùn)行程序,點(diǎn)擊MainActivity中的按鈕啟動(dòng)SecondActivity,啟動(dòng)后SecondActivity見圖4-4。4.3.3Category屬性

Category屬性通常和Action屬性組合在一起使用。Action屬性表示Intent需要執(zhí)行的“動(dòng)作”,Category則為“動(dòng)作”的執(zhí)行附加了額外的信息。例如,可將Intent的Category屬性值設(shè)置為L(zhǎng)AUNCHER_CATEGORY表示Intent的接收者將在Launcher中作為頂級(jí)應(yīng)用。下面修改應(yīng)用示例4-2,為該示例的Intent添加Category屬性。在項(xiàng)目視圖中,雙擊打開“MainActivity.java”文件,為MainActivity添加另一個(gè)字符串常量CATEGORY_1,然后找到onCreate(...)方法,添加下述代碼:publicclassMainActivityextendsAppCompatActivity{publicfinalstaticStringSTART_ACTION="com.example.actiontest.ACTIVITY_ACTION";

publicfinalstaticStringCATEGORY_1=

"com.example.actiontest.category1";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonbtn=(Button)findViewById(R.id.actionbtn);//為btn按鈕綁定事件監(jiān)聽器btn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewarg0){//創(chuàng)建Intent對(duì)象Intentintent=newIntent();//為Intent設(shè)置Action屬性intent.setAction(START_ACTION);//添加Category屬性

intent.addCategory(CATEGORY_1);startActivity(intent);}});}}代碼解釋:Category屬性的添加方法用粗體字標(biāo)記的代碼段表示??上雀鶕?jù)Intent需要執(zhí)行的具體動(dòng)作為該動(dòng)作定義一個(gè)Category常量;再使用Intent.addCategory()方法為Intent對(duì)象的動(dòng)作添加Category屬性。為匹配Intent對(duì)象中設(shè)置的category屬性,應(yīng)在AndroidManifest.xml文件中為SecondActivity添加<category>子標(biāo)簽。<activityandroid:name=".SecondActivity"android:label="SecondActivity"><intent-filter><actionandroid:name="com.example.actiontest.ACTIVITY_ACTION"/><categoryandroid:name="com.example.actiontest.category1"/></intent-filter></activity>最后,為SecondActivity增加一個(gè)文本框控件以顯示Intent中的Category屬性值。在項(xiàng)目視圖中,雙擊打開“SecondActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);

TextViewshow=(TextView)findViewById(R.id.showaction);Stringaction=getIntent().getAction();show.setText("Action屬性值:"+action);

TextViewshowcategory=(TextView)findViewById(R.id.showcategory);//獲取該Activity對(duì)應(yīng)的Intent的Category屬性

Set<String>cates=getIntent().getCategories();//顯示Category屬性showcategory.setText("Category屬性值:"+cates);}代碼解釋:Category屬性的獲取方法用粗體字標(biāo)記的代碼段表示。可使用Intent.getCategories()方法獲取Intent對(duì)象中的Category屬性集合;這樣,便可以在SecondActivity的文本框中顯示出Intent中添加的所有Category屬性信息。編譯并運(yùn)行程序,點(diǎn)擊MainActivity中的按鈕啟動(dòng)SecondActivity,啟動(dòng)后SecondActivity見圖4-5。

圖4-5顯示category屬性的SecondActivityIntent對(duì)象不僅能夠啟動(dòng)應(yīng)用程序內(nèi)的組件,只要獲取相應(yīng)系統(tǒng)權(quán)限,它甚至還能夠啟動(dòng)Android系統(tǒng)自帶的組件。表4-2和表4-3是Android系統(tǒng)為應(yīng)用開發(fā)預(yù)定義的一些標(biāo)準(zhǔn)Action和Category常量。

表4-2標(biāo)準(zhǔn)Action常量

表4-3標(biāo)準(zhǔn)Category常量常量值含義ACTION_MAIN標(biāo)識(shí)應(yīng)用程序的開始ACTION_VIEW啟動(dòng)一個(gè)最合理的Activity顯示URI數(shù)據(jù)ACTION_DIAL打開撥號(hào)窗口ACTION_CALL啟動(dòng)電話撥號(hào)組件ACTION_EDIT啟動(dòng)一個(gè)Activity編輯URI數(shù)據(jù)ACTION_ANSWER啟動(dòng)一個(gè)Activity處理來電ACTION_INSERT在游標(biāo)位置啟動(dòng)一個(gè)Activity以插入數(shù)據(jù)ACTION_DELETE在游標(biāo)位置啟動(dòng)一個(gè)Activity以刪除數(shù)據(jù)ACTION_PICK啟動(dòng)一個(gè)Activity以允許用戶挑選數(shù)據(jù)常量值含義CAT_DEEGORYFAULTCategory默認(rèn)值CATEGORY_BROWSABLE標(biāo)記目標(biāo)Activity可被Web瀏覽器安全調(diào)用CATEGORY_LAUNCHER標(biāo)記目標(biāo)Activity在應(yīng)用程序中最先被執(zhí)行CATEGORY_HOME標(biāo)記目標(biāo)Activity隨系統(tǒng)啟動(dòng)執(zhí)行CATEGORY_REFERENCE標(biāo)記目標(biāo)Activity是參數(shù)面板CATEGORY_INFO提供包信息CATEGORY_TAB標(biāo)記目標(biāo)Activity是TabActivity的Tab頁(yè)面CATEGORY_GADGET標(biāo)記目標(biāo)Activity可嵌入到其他Activity內(nèi)4.3.4Data屬性Data屬性通常用于向Action屬性提供操作攜帶的數(shù)據(jù)。例如,撥打電話時(shí),通訊錄中的一條聯(lián)系人信息。通常用URI字符串表示Data屬性值,一個(gè)URI字符串總是滿足下述格式:scheme://host:port/path其中:scheme是URI資源的名字空間標(biāo)識(shí)符,一般以字母作為起始字符;host標(biāo)識(shí)出URI資源的主機(jī)名;port則是主機(jī)通信端口;path標(biāo)識(shí)出資源文件在主機(jī)中的路徑。以URI字符串content://com.android.contacts/contacts/1為例,該URI資源表示通訊錄中的一條聯(lián)系人信息。對(duì)照URI字符串的標(biāo)準(zhǔn)格式,scheme是content;host是com.android.contacts;port被忽略,path是contacts/1。下面給出應(yīng)用示例4-3,說明Data屬性的使用方法。該應(yīng)用程序只有一個(gè)Activity:MainActivity。圖4-6是MainActivity,它的界面包含三個(gè)按鈕。第一個(gè)按鈕用于啟動(dòng)WEB瀏覽器訪問網(wǎng)頁(yè),如圖4-7所示;第二個(gè)按鈕用于啟動(dòng)通訊錄編輯器修改聯(lián)系人信息,如圖4-8所示;第三個(gè)按鈕用于啟動(dòng)系統(tǒng)撥號(hào)盤呼叫電話號(hào)碼,如圖4-9所示。

圖4-6MainActivity主界面

圖4-7啟動(dòng)Web瀏覽器

圖4-8啟動(dòng)通訊錄編輯器

圖4-9啟動(dòng)系統(tǒng)撥號(hào)盤在項(xiàng)目視圖中,雙擊打開“MainActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButtonWebtn=(Button)findViewById(R.id.webbrowse);//為“web瀏覽”按鈕綁定點(diǎn)擊事件監(jiān)聽器Webtn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();//設(shè)置Action屬性intent.setAction(Intent.ACTION_VIEW);

Stringdata="";//構(gòu)造Uri對(duì)象

Uriuri=Uri.parse(data);//設(shè)置Data屬性

intent.setData(uri);startActivity(intent);

}});Buttoneditbtn=(Button)findViewById(R.id.editcontactor);//為“編輯聯(lián)系人”按鈕綁定點(diǎn)擊事件監(jiān)聽器editbtn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();//設(shè)置Action屬性intent.setAction(Intent.ACTION_EDIT);

Stringdata="content://com.android.contacts/contacts/1";//構(gòu)造Uri對(duì)象

Uriuri=Uri.parse(data);//設(shè)置Data屬性

intent.setData(uri);startActivity(intent);}});Buttondial=(Button)findViewById(R.id.dialphone);//為“拔打電話”按鈕綁定點(diǎn)擊事件監(jiān)聽器dial.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();//為Intent設(shè)置Action屬性intent.setAction(Intent.ACTION_DIAL);

Stringdata="tel:10086";

//構(gòu)造Uri對(duì)象

Uriuri=Uri.parse(data);

//設(shè)置Data屬性

intent.setData(uri);startActivity(intent);}});}代碼解釋:Intent中Data屬性的設(shè)置方法用粗體字標(biāo)記的代碼段表示。可先使用Uri.parse()構(gòu)造出Uri對(duì)象封裝Data屬性值;再使用Intent.setData()方法為Intent設(shè)置Data屬性。這樣,當(dāng)啟動(dòng)目標(biāo)Activity時(shí),由Data屬性封裝的數(shù)據(jù)也會(huì)同時(shí)傳遞給目標(biāo)Activity。編譯并運(yùn)行程序,點(diǎn)擊MainActivity中的各個(gè)按鈕,可以觀察到啟動(dòng)后的目標(biāo)Activity如圖4-7、4-8和4-9所示。4.3.5Extra屬性Extra屬性通常用于執(zhí)行“動(dòng)作”時(shí)向目標(biāo)組件傳遞擴(kuò)展信息。例如,當(dāng)執(zhí)行“發(fā)送email”動(dòng)作時(shí),可以將email的subject和body封裝到extra屬性,傳遞給email發(fā)送組件。Extra屬性值一般用一個(gè)Bundle對(duì)象表示,它可以存入一個(gè)或多個(gè)鍵-值對(duì)。下面給出應(yīng)用示例4-4,說明Extra屬性的使用方法。該應(yīng)用程序有兩個(gè)Activity:MainActivity和SecondActivity。圖4-10是MainActivity,它的界面包含一個(gè)文本輸入框和一個(gè)按鈕。可在文本輸入框中輸入向SecondActivity傳遞的數(shù)據(jù),當(dāng)單擊文本輸入框下方的按鈕時(shí),將啟動(dòng)SecondActivity;SecondActivity會(huì)同時(shí)將文本框中輸入的內(nèi)容顯示出來。如圖4-11所示。

圖4-10MainActivity圖4-11SecondActivity在項(xiàng)目視圖中,雙擊打開“MainActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Buttonextrabtn;finalEditTextinput;extrabtn=(Button)findViewById(R.id.ExtraButton);input=(EditText)findViewById(R.id.inputEditText);

extrabtn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(MainActivity.this,SecondActivity.class);//為intent添加Extra屬性

intent.putExtra("exchangedata",input.getText().toString());startActivity(intent);}});}

代碼解釋:Intent中Extra屬性的設(shè)置方法用粗體字標(biāo)記的代碼段表示。可使用Intent.putExtra()方法將一個(gè)鍵值對(duì)設(shè)置為Intent的Extra屬性。這樣,當(dāng)啟動(dòng)目標(biāo)Activity時(shí),由Extra屬性封裝的數(shù)據(jù)也會(huì)同時(shí)傳遞給目標(biāo)Activity。在項(xiàng)目視圖中,雙擊打開“SecondActivity.java”文件,找到onCreate(...)方法,添加代碼以顯示由Intent傳遞而來的Extra屬性值。protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Intentintent=this.getIntent();TextViewtv=(TextView)findViewById(R.id.TextView1);//從Intent獲得Extra屬性值,顯示到TextView控件

tv.setText(intent.getStringExtra("exchangedata"));}代碼解釋:Intent中Extra屬性的獲取方法用粗體字標(biāo)記的代碼段表示??墒褂肐ntent.getStringExtra(...)方法將extra屬性中封裝的鍵值對(duì)提取出來。這樣,當(dāng)目標(biāo)Activity啟動(dòng)后,由Intent的Extra屬性封裝的信息,便顯示到了TextView控件,如圖4-12所示。4.3.6Flag屬性Flag屬性用于控制新啟動(dòng)的Activity在返回棧中的順序。Android為Intent提供了大量的flag,可通過Intent.addFlags()方法為Intent添加控制標(biāo)識(shí)。表4-4是Android系統(tǒng)為應(yīng)用開發(fā)預(yù)定義的一些標(biāo)準(zhǔn)Flag常量。

4.3.6Flag屬性

表4-4標(biāo)準(zhǔn)Flag常量常量值含義FLAG_ACTIVITY_NEW_TASK默認(rèn)啟動(dòng)標(biāo)識(shí),指示創(chuàng)建一個(gè)新的ActivityFLAG_ACTIVITY_BROUGHT_TO_FRONT若目標(biāo)Activity已存在,再次啟動(dòng)時(shí)把該Activity帶到前臺(tái)FLAG_ACTIVITY_CLEAR_TOP將返回棧中目標(biāo)Activity之上的所有Activity全部彈出FLAG_ACTIVITY_NO_ANIMATION啟動(dòng)Activity時(shí)不使用過渡動(dòng)畫FLAG_ACTIVITY_NO_HISTORY啟動(dòng)的Activity將不會(huì)保留在返回棧中FLAG_ACTIVITY_REORDER_TO_FRONT若返回棧中已有目標(biāo)Activity,將該Activity帶到前臺(tái)FLAG_ACTIVITY_SINGLE_TOP以singleTop模式啟動(dòng)Activity4.4Intent對(duì)象解析在Intent的實(shí)現(xiàn)機(jī)制中,Android系統(tǒng)負(fù)責(zé)接收和分析Intent對(duì)象,并為調(diào)用組件選擇最適合的目標(biāo)組件。依據(jù)目標(biāo)組件選擇方法的不同,可將Intent劃分為顯式Intent和隱式Intent。顯式Intent指的是配置有Component屬性信息的Intent對(duì)象。調(diào)用組件可以使用Intent.SetComponent()或Intent.SetClass()方法明確指定目標(biāo)組件。當(dāng)Android系統(tǒng)接收到調(diào)用組件發(fā)送的顯式Intent對(duì)象后,通過校驗(yàn)對(duì)象中包含的Component屬性值就能夠構(gòu)造出目標(biāo)組件,并直接將Intent對(duì)象傳遞給目標(biāo)組件。在應(yīng)用程序內(nèi)部,調(diào)用組件和目標(biāo)組件彼此透明,往往只要求將消息盡快傳遞出去,因此顯示式Intent通常用在與應(yīng)用程序內(nèi)部組件之間的通信。相對(duì)于顯式Intent而言,隱式Intent不直接指明目標(biāo)組件,僅要求目標(biāo)組件能夠按照Intent對(duì)象描述的“動(dòng)作”完成相應(yīng)的任務(wù)。而對(duì)于Android系統(tǒng)而言,它的主要職責(zé)是根據(jù)Intent對(duì)象中配置的屬性信息,查找出符合Intent屬性配置的目標(biāo)組件,或者在用戶的幫助下選擇最適合的目標(biāo)組件。隱式Intent能夠很好地實(shí)現(xiàn)調(diào)用組件和目標(biāo)組件之間的解耦,極大提升應(yīng)用程序的靈活性,通常用于在不同應(yīng)用程序組件之間的通信。4.4.1Intent-Filter

Android為應(yīng)用組件引入了Intent-Filter對(duì)象,以通知Android系統(tǒng)不同應(yīng)用組件能夠接收、處理的隱式Intent對(duì)象。Intent-Filter描述了組件的一種能力,即能夠接收、處理一種Intent。與Intent對(duì)象類似,Intent-Filter對(duì)象也包含了Action、Category和Data等多個(gè)屬性,并且各個(gè)屬性的含義和數(shù)據(jù)結(jié)構(gòu)與Intent對(duì)象一一對(duì)應(yīng)。每個(gè)應(yīng)用組件可包含一個(gè)或多個(gè)Intent-Filter。一個(gè)應(yīng)用組件包含的Intent-Filter對(duì)象越多,它能夠接收Intent的請(qǐng)求范圍就越廣。相應(yīng)地,該應(yīng)用組件的代碼邏輯也會(huì)越復(fù)雜。一般來說,可為應(yīng)用組件的每一項(xiàng)邏輯功能設(shè)置一個(gè)獨(dú)立的Intent-Filter對(duì)象。Intent-Filter一般是在項(xiàng)目?jī)?nèi)的AndroidManifest.xml清單文件中以<intent-filter>標(biāo)簽的方式聲明,并放置在相應(yīng)Activity、Service和觸發(fā)器等組件的配置項(xiàng)中。例如:<!--IntentFilter對(duì)象可以放在activity等組件配置中--><activity><intent-filterandroid:icon="..."android:label="..."android:priority="..."><actionandroid:name="..."/><categoryandroid:name="..."/><dataandroid:host="..."android:mimeType="..."android:path="..."android:pathPattern="..."android:port="..."android:acheme="..."/><!--可以繼續(xù)添加相關(guān)的action、category和data項(xiàng)--></intent-filter--><!--可以繼續(xù)添加相關(guān)的intent-filter項(xiàng)--></activity>1.<action>標(biāo)簽每個(gè)Intent-Filter對(duì)象都必須包含<action>標(biāo)簽,它與Intent設(shè)置的Action屬性一一對(duì)應(yīng)。不同的是,一個(gè)Intent只能配置一個(gè)Action屬性值;而每個(gè)Intent-Filter對(duì)象則允許配置多個(gè)<action>標(biāo)簽,表示該Intent-Filter能夠支持多種Intent“動(dòng)作”。對(duì)于大多數(shù)Intent-Filter對(duì)象而言,往往只包含一個(gè)<action>標(biāo)簽。只有當(dāng)應(yīng)用組件期望支持多種Action,并且它們所對(duì)應(yīng)的Intent-Filter對(duì)象的其它屬性配置項(xiàng)完全相同時(shí),才會(huì)考慮將多個(gè)<action>標(biāo)簽添加到同一個(gè)Intent-Filter對(duì)象中。此外,也可以使用IntentFilter.addAction()方法動(dòng)態(tài)地為Intent-Filter對(duì)象添加<action>標(biāo)簽。2.<category>標(biāo)簽每個(gè)Intent-Filter對(duì)象都可包含<category>標(biāo)簽,以表示該對(duì)象能夠接收的IntentCategory分類。同一Intent-Filter對(duì)象下的各個(gè)<category>標(biāo)簽是一種邏輯“或”的關(guān)系,即該Intent-Filter無論滿足哪一個(gè)Category約束,都能夠接收、處理相應(yīng)的Intent請(qǐng)求。此外,也可以使用IntentFilter.addCategory()方法動(dòng)態(tài)地為Intent-Filter對(duì)象添加<category>標(biāo)簽。3.<data>標(biāo)簽通過添加<data>標(biāo)簽,可以為Intent-Filter對(duì)象添加可接受的數(shù)據(jù)信息。每個(gè)<data>標(biāo)簽都應(yīng)指定一種數(shù)據(jù)類型(mimeType)和一個(gè)URI。例如:<intent-filter>

<dataandroid:mimeType="..."android:scheme="http".../><dataandroid:mimeType="..."android:scheme="http".../></intent-filter>其中:android:mimeType屬性與Intent配置的Type屬性相對(duì)應(yīng),表示Intent-Filter可接受的數(shù)據(jù)類型;android:scheme屬性則表示Intent-Filter可接受的數(shù)據(jù)范圍。URI包含四個(gè)屬性scheme、host、port和path,其格式如下:scheme://host:port/path在URI中,host和port共同構(gòu)成憑據(jù)(authority)。URI的四個(gè)屬性都是可選的,但是它們之間并不完全獨(dú)立。例如,要使authority有意義,應(yīng)指定scheme;要使path有意義,必須要同時(shí)指定scheme和authority。4.4.2Intent-Filter和Intent的匹配

當(dāng)Android系統(tǒng)接收到請(qǐng)求組件的Intent對(duì)象后,會(huì)首先檢查Intent對(duì)象是否包含了目標(biāo)組件的Component信息。如果未包含,Android系統(tǒng)將從Android應(yīng)用的AndroidManifest.xml清單文件中檢查所有應(yīng)用組件注冊(cè)的Intent-Filter對(duì)象,并與Intent對(duì)象進(jìn)行比較。最后,選擇與Intent最匹配的目標(biāo)組件。Intent對(duì)象和Intent-Filter對(duì)象的匹配,包括對(duì)Action、Category和Data屬性的匹配。1.Action匹配如果Intent對(duì)象未配置Action屬性,Android系統(tǒng)將跳過Action匹配,繼續(xù)對(duì)其它匹配項(xiàng)進(jìn)行檢查。如果Intent對(duì)象指定了某一Action屬性值;那么,該屬性值就必須包

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論