版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第4章Android核心組件—Intent本章簡介一個Intent就是對一次即將進行操作的抽象描述,它封裝了Android應(yīng)用的啟動“意圖”。使用Intent傳播動作是Android應(yīng)用的基本設(shè)計理念。Intent不僅既能夠有效降低應(yīng)用組件間的代碼耦合,還是應(yīng)用組件間通信的重要媒介。本章將在對Intent基本概念進行介紹的基礎(chǔ)上,重點為讀者講解Intent的結(jié)構(gòu)、類型和使用方法。本章目錄4.1Intent概述4.2Intent的功能4.3Intent的屬性4.4Intent對象解析4.5小結(jié)4.6習(xí)題4.1Intent概述Intent是一種利用消息進行交互的機制。Intent對象描述了應(yīng)用中一次操作的動作、動作涉及的數(shù)據(jù)及其附加信息。用戶可以使用Intent在Android設(shè)備上的應(yīng)用程序或組件之間傳遞交互信息,具體有如下3種形式:(1)通過調(diào)用startActivity()方法傳入一個Intent對象,啟動新的Activity。(2)通過broadcastIntent機制將一個Intent發(fā)送給任何對該Intent感興趣的BoadcastReceiver。(3)通過調(diào)用startService()或bindService()方法與后臺Service進行交互。此外,Android系統(tǒng)還能通過廣播Intent通知發(fā)生的系統(tǒng)事件。例如,無線網(wǎng)絡(luò)連接狀態(tài)的變化、來電或電池電量信息等。使用Intent傳播動作是Android應(yīng)用的基本設(shè)計理念。4.2Intent的功能Intent消息是一種同一或不同應(yīng)用程序中的組件之間延遲運行時綁定的機制。Android系統(tǒng)會根據(jù)Intent對動作的描述查找到相應(yīng)組件,將Intent傳遞給調(diào)用的組件,并完成對組件的調(diào)用。Android應(yīng)用程序的三個核心組件是Activity、Services和BroadcastReceiver。在Android應(yīng)用開發(fā)中,Intent對象為啟動這些組件提供了一致的操作方式。下表給出了Intent啟動核心組件的典型方法。Intent啟動核心組件的典型方法組件名啟動方法功能ActivitystartActivity()startActivityForResult()啟動新的ActivityServicesstartService()啟動新的ServiceBroadcastReceiversendBroadcast()sendOrderedBroadcast()sendStickyBroadcast()sendStickyOrderedBroadcast()向BroadcastReceiver發(fā)送消息4.3Intent的屬性一個Intent對象就是一組信息,它代表了應(yīng)用組件的啟動"意圖",Android系統(tǒng)會根據(jù)Intent對象的屬性配置來啟動目標(biāo)組件。Intent的屬性主要有Component、Action、Category、Data、Extra和Flag六種,可使用Intent.setXXX()方法為Intent對象設(shè)置相應(yīng)屬性。4.3.1Component屬性Component屬性用于指定目標(biāo)組件的類型信息。在Android應(yīng)用開發(fā)時,既可使用Intent.setComponent()方法利用目標(biāo)組件類名對該屬性值進行設(shè)置,也可以使用Intent.setClass()方法利用目標(biāo)組件對象信息對該屬性值進行設(shè)置。通常Android系統(tǒng)會根據(jù)Intent中包含的其它屬性信息(例如:Action、Data和Category等屬性)來查找目標(biāo)組件。而一旦指定了Component屬性,Android系統(tǒng)就能夠唯一地確定啟動的目標(biāo)組件,不再執(zhí)行對目標(biāo)組件的查找。已指定Component屬性的Intent具有明確的啟動組件,稱作顯式Intent。沒有指定Component屬性的Intent稱作是隱式Intent。4.3.1Component屬性下面給出應(yīng)用示例4-1,說明Component屬性的使用方法。該應(yīng)用程序包含兩個Activity:MainActivity和SecondActivity。圖4-1是MainActivity,它的界面只有一個按鈕,單擊該按鈕后將創(chuàng)建一個顯式Intent,以啟動SecondActivity。SecondActivity啟動后,將使用文本框顯示Component屬性中指定的目標(biāo)包名和類名,如圖4-2所示。4.3.1Component屬性圖4-1MainActivity 圖4-2SecondActivity在項目視圖中,雙擊打開“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)造一個ComponentName對象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對象;再使用Intent.setComponent()方法為Intent對象設(shè)置Component屬性。這樣,應(yīng)用程序就可以根據(jù)Intent對象的“意圖”啟動目標(biāo)組件。當(dāng)應(yīng)用程序通過Component屬性為Intent對象指定被啟動的目標(biāo)組件后,無需再在AndroidManifest.xml文件中為目標(biāo)組件配置<intent-filter>標(biāo)簽即可啟動目標(biāo)組件。在項目視圖中,雙擊打開“SecondActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);
EditTextshow=(EditText)findViewById(R.id.Componentshow);//獲取啟動該Activity的Intent對象的Component屬性ComponentNamecomp=getIntent().getComponent();//顯示Component屬性的包名和類名show.setText("目標(biāo)組件包名:"+comp.getPackageName()+"\n目標(biāo)組件類名:"+comp.getClassName());}代碼解釋:Intent中Component屬性的獲取方法用粗體字標(biāo)記的代碼段表示??墒褂肐ntent.getComponent()方法獲取Intent對象中指定的Component屬性;再使用ComponentName.getPackageName()和ComponentName.getClassName()方法取出Component屬性的包名和類名。這樣,便可以在SecondActivity的文本框中顯示出Intent的Component屬性信息。編譯并運行程序,點擊MainActivity中的按鈕啟動SecondActivity,啟動后SecondActivity見圖4-2。4.3.2Action屬性Action屬性用于指明Intent需要執(zhí)行的具體動作。為實現(xiàn)Intent對象與目標(biāo)組件最大程度的解耦,Action屬性只規(guī)定出要執(zhí)行的動作名稱,而不指明具體的目標(biāo)組件。以Android提供的標(biāo)準(zhǔn)Action屬性——ACTION_VIEW為例,該屬性只表示出一種抽象的內(nèi)容顯示操作,它既不限制啟動應(yīng)哪一個Activity來顯示內(nèi)容,也不限制其具體顯示內(nèi)容。如果某一個Activity希望響應(yīng)特定Intent設(shè)置的動作,僅需在AndroidManifest.xml文件內(nèi)找到標(biāo)識該Activity的標(biāo)簽,為其增加<intent-filter>和<action>子標(biāo)簽,并在<action>子標(biāo)簽中將其屬性值設(shè)置為與Intent的Action屬性值相同。4.3.3Category屬性下面給出應(yīng)用示例4-2,說明Action屬性的使用方法。該應(yīng)用程序包含兩個Activity:MainActivity和SecondActivity。圖4-3是MainActivity,它的界面只有一個按鈕,單擊該按鈕后將創(chuàng)建一個Intent,并為其設(shè)置Action屬性值,以啟動SecondActivity。SecondActivity啟動后,將使用文本框顯示Action屬性值,如圖4-4所示。圖4-3MainActivity 圖4-4SecondActivity在項目視圖中,雙擊打開“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對象Intentintent=newIntent();//為Intent設(shè)置Action屬性
intent.setAction(START_ACTION);startActivity(intent);}});}}
代碼解釋:Action屬性的指定方法用粗體字標(biāo)記的代碼段表示。可先根據(jù)Intent需要執(zhí)行的具體動作為該動作定義一個常量名;再使用Intent.setAction()方法為Intent對象設(shè)置Action屬性。這樣,應(yīng)用程序就可以根據(jù)Intent對象的“意圖”啟動目標(biāo)組件。但是,該Intent對象并未明確指定要啟動的目標(biāo)Activity。為了啟動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)簽,以過濾出與啟動該Activity有關(guān)的Intent。<intent-filter>標(biāo)簽下的<action>和<category>子標(biāo)簽則用于聲明相關(guān)Intent的Action屬性值和Category屬性值。只有當(dāng)這兩個子標(biāo)簽的屬性值與Intent對象中設(shè)置的屬性值都相同時,目標(biāo)Activity才能被Android啟動。
值得注意的是,Intent默認(rèn)的Category屬性值為CATEGORY_DEFAULT(字符串常量)。因此,如果在創(chuàng)建Intent對象時未設(shè)置Category屬性值,就需要在目標(biāo)組件中將<category>標(biāo)簽中配置為CATEGORY_DEFAULT。此外,一個Intent對象最多只能設(shè)置一個Action屬性,但是可以設(shè)置多個Category屬性。
最后,在項目視圖中,雙擊打開“SecondActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);
TextViewshow=(TextView)findViewById(R.id.showaction);//獲取啟動該Activity的Intent的Action屬性值
Stringaction=getIntent().getAction();//顯示Action屬性值show.setText("Action屬性值:"+action);}
代碼解釋:Intent中Action屬性的獲取方法用粗體字標(biāo)記的代碼段表示??墒褂肐ntent.getAction()方法獲取Intent對象中指定的Action屬性;這樣,便可以在SecondActivity的文本框中顯示出Intent的Action屬性信息。編譯并運行程序,點擊MainActivity中的按鈕啟動SecondActivity,啟動后SecondActivity見圖4-4。4.3.3Category屬性
Category屬性通常和Action屬性組合在一起使用。Action屬性表示Intent需要執(zhí)行的“動作”,Category則為“動作”的執(zhí)行附加了額外的信息。例如,可將Intent的Category屬性值設(shè)置為LAUNCHER_CATEGORY表示Intent的接收者將在Launcher中作為頂級應(yīng)用。下面修改應(yīng)用示例4-2,為該示例的Intent添加Category屬性。在項目視圖中,雙擊打開“MainActivity.java”文件,為MainActivity添加另一個字符串常量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對象Intentintent=newIntent();//為Intent設(shè)置Action屬性intent.setAction(START_ACTION);//添加Category屬性
intent.addCategory(CATEGORY_1);startActivity(intent);}});}}代碼解釋:Category屬性的添加方法用粗體字標(biāo)記的代碼段表示??上雀鶕?jù)Intent需要執(zhí)行的具體動作為該動作定義一個Category常量;再使用Intent.addCategory()方法為Intent對象的動作添加Category屬性。為匹配Intent對象中設(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增加一個文本框控件以顯示Intent中的Category屬性值。在項目視圖中,雙擊打開“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對應(yīng)的Intent的Category屬性
Set<String>cates=getIntent().getCategories();//顯示Category屬性showcategory.setText("Category屬性值:"+cates);}代碼解釋:Category屬性的獲取方法用粗體字標(biāo)記的代碼段表示??墒褂肐ntent.getCategories()方法獲取Intent對象中的Category屬性集合;這樣,便可以在SecondActivity的文本框中顯示出Intent中添加的所有Category屬性信息。編譯并運行程序,點擊MainActivity中的按鈕啟動SecondActivity,啟動后SecondActivity見圖4-5。
圖4-5顯示category屬性的SecondActivityIntent對象不僅能夠啟動應(yīng)用程序內(nèi)的組件,只要獲取相應(yīng)系統(tǒng)權(quán)限,它甚至還能夠啟動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)識應(yīng)用程序的開始ACTION_VIEW啟動一個最合理的Activity顯示URI數(shù)據(jù)ACTION_DIAL打開撥號窗口ACTION_CALL啟動電話撥號組件ACTION_EDIT啟動一個Activity編輯URI數(shù)據(jù)ACTION_ANSWER啟動一個Activity處理來電ACTION_INSERT在游標(biāo)位置啟動一個Activity以插入數(shù)據(jù)ACTION_DELETE在游標(biāo)位置啟動一個Activity以刪除數(shù)據(jù)ACTION_PICK啟動一個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)啟動執(zhí)行CATEGORY_REFERENCE標(biāo)記目標(biāo)Activity是參數(shù)面板CATEGORY_INFO提供包信息CATEGORY_TAB標(biāo)記目標(biāo)Activity是TabActivity的Tab頁面CATEGORY_GADGET標(biāo)記目標(biāo)Activity可嵌入到其他Activity內(nèi)4.3.4Data屬性Data屬性通常用于向Action屬性提供操作攜帶的數(shù)據(jù)。例如,撥打電話時,通訊錄中的一條聯(lián)系人信息。通常用URI字符串表示Data屬性值,一個URI字符串總是滿足下述格式:scheme://host:port/path其中:scheme是URI資源的名字空間標(biāo)識符,一般以字母作為起始字符;host標(biāo)識出URI資源的主機名;port則是主機通信端口;path標(biāo)識出資源文件在主機中的路徑。以URI字符串content://com.android.contacts/contacts/1為例,該URI資源表示通訊錄中的一條聯(lián)系人信息。對照URI字符串的標(biāo)準(zhǔn)格式,scheme是content;host是com.android.contacts;port被忽略,path是contacts/1。下面給出應(yīng)用示例4-3,說明Data屬性的使用方法。該應(yīng)用程序只有一個Activity:MainActivity。圖4-6是MainActivity,它的界面包含三個按鈕。第一個按鈕用于啟動WEB瀏覽器訪問網(wǎng)頁,如圖4-7所示;第二個按鈕用于啟動通訊錄編輯器修改聯(lián)系人信息,如圖4-8所示;第三個按鈕用于啟動系統(tǒng)撥號盤呼叫電話號碼,如圖4-9所示。
圖4-6MainActivity主界面
圖4-7啟動Web瀏覽器
圖4-8啟動通訊錄編輯器
圖4-9啟動系統(tǒng)撥號盤在項目視圖中,雙擊打開“MainActivity.java”文件,找到onCreate(...)方法,添加如下代碼:protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButtonWebtn=(Button)findViewById(R.id.webbrowse);//為“web瀏覽”按鈕綁定點擊事件監(jiān)聽器Webtn.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();//設(shè)置Action屬性intent.setAction(Intent.ACTION_VIEW);
Stringdata="";//構(gòu)造Uri對象
Uriuri=Uri.parse(data);//設(shè)置Data屬性
intent.setData(uri);startActivity(intent);
}});Buttoneditbtn=(Button)findViewById(R.id.editcontactor);//為“編輯聯(liá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對象
Uriuri=Uri.parse(data);//設(shè)置Data屬性
intent.setData(uri);startActivity(intent);}});Buttondial=(Button)findViewById(R.id.dialphone);//為“拔打電話”按鈕綁定點擊事件監(jiān)聽器dial.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){Intentintent=newIntent();//為Intent設(shè)置Action屬性intent.setAction(Intent.ACTION_DIAL);
Stringdata="tel:10086";
//構(gòu)造Uri對象
Uriuri=Uri.parse(data);
//設(shè)置Data屬性
intent.setData(uri);startActivity(intent);}});}代碼解釋:Intent中Data屬性的設(shè)置方法用粗體字標(biāo)記的代碼段表示??上仁褂肬ri.parse()構(gòu)造出Uri對象封裝Data屬性值;再使用Intent.setData()方法為Intent設(shè)置Data屬性。這樣,當(dāng)啟動目標(biāo)Activity時,由Data屬性封裝的數(shù)據(jù)也會同時傳遞給目標(biāo)Activity。編譯并運行程序,點擊MainActivity中的各個按鈕,可以觀察到啟動后的目標(biāo)Activity如圖4-7、4-8和4-9所示。4.3.5Extra屬性Extra屬性通常用于執(zhí)行“動作”時向目標(biāo)組件傳遞擴展信息。例如,當(dāng)執(zhí)行“發(fā)送email”動作時,可以將email的subject和body封裝到extra屬性,傳遞給email發(fā)送組件。Extra屬性值一般用一個Bundle對象表示,它可以存入一個或多個鍵-值對。下面給出應(yīng)用示例4-4,說明Extra屬性的使用方法。該應(yīng)用程序有兩個Activity:MainActivity和SecondActivity。圖4-10是MainActivity,它的界面包含一個文本輸入框和一個按鈕。可在文本輸入框中輸入向SecondActivity傳遞的數(shù)據(jù),當(dāng)單擊文本輸入框下方的按鈕時,將啟動SecondActivity;SecondActivity會同時將文本框中輸入的內(nèi)容顯示出來。如圖4-11所示。
圖4-10MainActivity圖4-11SecondActivity在項目視圖中,雙擊打開“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)記的代碼段表示??墒褂肐ntent.putExtra()方法將一個鍵值對設(shè)置為Intent的Extra屬性。這樣,當(dāng)啟動目標(biāo)Activity時,由Extra屬性封裝的數(shù)據(jù)也會同時傳遞給目標(biāo)Activity。在項目視圖中,雙擊打開“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屬性中封裝的鍵值對提取出來。這樣,當(dāng)目標(biāo)Activity啟動后,由Intent的Extra屬性封裝的信息,便顯示到了TextView控件,如圖4-12所示。4.3.6Flag屬性Flag屬性用于控制新啟動的Activity在返回棧中的順序。Android為Intent提供了大量的flag,可通過Intent.addFlags()方法為Intent添加控制標(biāo)識。表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)啟動標(biāo)識,指示創(chuàng)建一個新的ActivityFLAG_ACTIVITY_BROUGHT_TO_FRONT若目標(biāo)Activity已存在,再次啟動時把該Activity帶到前臺FLAG_ACTIVITY_CLEAR_TOP將返回棧中目標(biāo)Activity之上的所有Activity全部彈出FLAG_ACTIVITY_NO_ANIMATION啟動Activity時不使用過渡動畫FLAG_ACTIVITY_NO_HISTORY啟動的Activity將不會保留在返回棧中FLAG_ACTIVITY_REORDER_TO_FRONT若返回棧中已有目標(biāo)Activity,將該Activity帶到前臺FLAG_ACTIVITY_SINGLE_TOP以singleTop模式啟動Activity4.4Intent對象解析在Intent的實現(xiàn)機制中,Android系統(tǒng)負(fù)責(zé)接收和分析Intent對象,并為調(diào)用組件選擇最適合的目標(biāo)組件。依據(jù)目標(biāo)組件選擇方法的不同,可將Intent劃分為顯式Intent和隱式Intent。顯式Intent指的是配置有Component屬性信息的Intent對象。調(diào)用組件可以使用Intent.SetComponent()或Intent.SetClass()方法明確指定目標(biāo)組件。當(dāng)Android系統(tǒng)接收到調(diào)用組件發(fā)送的顯式Intent對象后,通過校驗對象中包含的Component屬性值就能夠構(gòu)造出目標(biāo)組件,并直接將Intent對象傳遞給目標(biāo)組件。在應(yīng)用程序內(nèi)部,調(diào)用組件和目標(biāo)組件彼此透明,往往只要求將消息盡快傳遞出去,因此顯示式Intent通常用在與應(yīng)用程序內(nèi)部組件之間的通信。相對于顯式Intent而言,隱式Intent不直接指明目標(biāo)組件,僅要求目標(biāo)組件能夠按照Intent對象描述的“動作”完成相應(yīng)的任務(wù)。而對于Android系統(tǒng)而言,它的主要職責(zé)是根據(jù)Intent對象中配置的屬性信息,查找出符合Intent屬性配置的目標(biāo)組件,或者在用戶的幫助下選擇最適合的目標(biāo)組件。隱式Intent能夠很好地實現(xiàn)調(diào)用組件和目標(biāo)組件之間的解耦,極大提升應(yīng)用程序的靈活性,通常用于在不同應(yīng)用程序組件之間的通信。4.4.1Intent-Filter
Android為應(yīng)用組件引入了Intent-Filter對象,以通知Android系統(tǒng)不同應(yīng)用組件能夠接收、處理的隱式Intent對象。Intent-Filter描述了組件的一種能力,即能夠接收、處理一種Intent。與Intent對象類似,Intent-Filter對象也包含了Action、Category和Data等多個屬性,并且各個屬性的含義和數(shù)據(jù)結(jié)構(gòu)與Intent對象一一對應(yīng)。每個應(yīng)用組件可包含一個或多個Intent-Filter。一個應(yīng)用組件包含的Intent-Filter對象越多,它能夠接收Intent的請求范圍就越廣。相應(yīng)地,該應(yīng)用組件的代碼邏輯也會越復(fù)雜。一般來說,可為應(yīng)用組件的每一項邏輯功能設(shè)置一個獨立的Intent-Filter對象。Intent-Filter一般是在項目內(nèi)的AndroidManifest.xml清單文件中以<intent-filter>標(biāo)簽的方式聲明,并放置在相應(yīng)Activity、Service和觸發(fā)器等組件的配置項中。例如:<!--IntentFilter對象可以放在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項--></intent-filter--><!--可以繼續(xù)添加相關(guān)的intent-filter項--></activity>1.<action>標(biāo)簽每個Intent-Filter對象都必須包含<action>標(biāo)簽,它與Intent設(shè)置的Action屬性一一對應(yīng)。不同的是,一個Intent只能配置一個Action屬性值;而每個Intent-Filter對象則允許配置多個<action>標(biāo)簽,表示該Intent-Filter能夠支持多種Intent“動作”。對于大多數(shù)Intent-Filter對象而言,往往只包含一個<action>標(biāo)簽。只有當(dāng)應(yīng)用組件期望支持多種Action,并且它們所對應(yīng)的Intent-Filter對象的其它屬性配置項完全相同時,才會考慮將多個<action>標(biāo)簽添加到同一個Intent-Filter對象中。此外,也可以使用IntentFilter.addAction()方法動態(tài)地為Intent-Filter對象添加<action>標(biāo)簽。2.<category>標(biāo)簽每個Intent-Filter對象都可包含<category>標(biāo)簽,以表示該對象能夠接收的IntentCategory分類。同一Intent-Filter對象下的各個<category>標(biāo)簽是一種邏輯“或”的關(guān)系,即該Intent-Filter無論滿足哪一個Category約束,都能夠接收、處理相應(yīng)的Intent請求。此外,也可以使用IntentFilter.addCategory()方法動態(tài)地為Intent-Filter對象添加<category>標(biāo)簽。3.<data>標(biāo)簽通過添加<data>標(biāo)簽,可以為Intent-Filter對象添加可接受的數(shù)據(jù)信息。每個<data>標(biāo)簽都應(yīng)指定一種數(shù)據(jù)類型(mimeType)和一個URI。例如:<intent-filter>
<dataandroid:mimeType="..."android:scheme="http".../><dataandroid:mimeType="..."android:scheme="http".../></intent-filter>其中:android:mimeType屬性與Intent配置的Type屬性相對應(yīng),表示Intent-Filter可接受的數(shù)據(jù)類型;android:scheme屬性則表示Intent-Filter可接受的數(shù)據(jù)范圍。URI包含四個屬性scheme、host、port和path,其格式如下:scheme://host:port/path在URI中,host和port共同構(gòu)成憑據(jù)(authority)。URI的四個屬性都是可選的,但是它們之間并不完全獨立。例如,要使authority有意義,應(yīng)指定scheme;要使path有意義,必須要同時指定scheme和authority。4.4.2Intent-Filter和Intent的匹配
當(dāng)Android系統(tǒng)接收到請求組件的Intent對象后,會首先檢查Intent對象是否包含了目標(biāo)組件的Component信息。如果未包含,Android系統(tǒng)將從Android應(yīng)用的AndroidManifest.xml清單文件中檢查所有應(yīng)用組件注冊的Intent-Filter對象,并與Intent對象進行比較。最后,選擇與Intent最匹配的目標(biāo)組件。Intent對象和Intent-Filter對象的匹配,包括對Action、Category和Data屬性的匹配。1.Action匹配如果Intent對象未配置Action屬性,Android系統(tǒng)將跳過Action匹配,繼續(xù)對其它匹配項進行檢查。如果Intent對象指定了某一Action屬性值;那么,該屬性值就必須包
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 意式咖啡課程設(shè)計
- 直面矛盾心理課程設(shè)計
- 班會主題早戀課程設(shè)計
- 穩(wěn)壓電源設(shè)計課程設(shè)計
- 瑜伽館線上直播課程設(shè)計
- 管殼式冷卻器的課程設(shè)計
- 種植扁豆生成課程設(shè)計
- 白瓷影像技術(shù)課程設(shè)計
- 查詢專輯歌手課程設(shè)計
- 紙漿畫課程設(shè)計
- 期末測試卷(一)2024-2025學(xué)年 人教版PEP英語五年級上冊(含答案含聽力原文無聽力音頻)
- 2023-2024學(xué)年廣東省深圳市南山區(qū)八年級(上)期末英語試卷
- 漢服娃衣創(chuàng)意設(shè)計與制作智慧樹知到期末考試答案章節(jié)答案2024年四川文化產(chǎn)業(yè)職業(yè)學(xué)院
- 機制砂檢測報告
- 省教育廳檢查組接待方案
- 變壓器停、送電操作步驟與注意事項
- 氣動潛孔錘施工方案
- 風(fēng)電項目監(jiān)理大綱附錄風(fēng)電工程設(shè)備監(jiān)理項目表
- 云南省教育科學(xué)規(guī)劃課題開題報告 - 云南省教育科學(xué)研究院
- 二年級上,數(shù)學(xué),3個兩位數(shù)加減,80題,(豎式計算)
- 人民法院涉訴信訪案件終結(jié)辦法
評論
0/150
提交評論