Android應用將會根據Intent來啓動指定組件,至於到底啓動哪一個組件,則取決於Intent的各屬性。本期將詳細介紹Intent的各屬性值,以及 Android如何根據不一樣屬性值來啓動相應的組件。java
Intent 對象大體包含 Component、Action、Category、Data、Type、Extra 和 Flag 這 7 種屬性,其中Component用於明確指定須要啓動的目標組件,而Extra則用於攜帶須要交換的數據。android
Intent 的 Component 屬性須要接受一個 ComponentName 對象,ComponentName 對象包含以下幾個構造器。微信
ComponentName(String pkg, String cls):建立pkg所在包下的cls類所對應的組件。架構
ComponentName(Context pkg, String cls):建立pkg所對應的包下的cls類所對應的組件。app
ComponentName(Context pkg, Class<?> cls):建立 pkg 所對應的包下的 cls 類所對應的組件。ide
上面幾個構造器的本質是相同的,這說明建立一個ComponentName須要指定包名和類名。這樣就能夠惟一地肯定一個組件類,這樣應用程序便可根據給定的組件類去啓動特定的組件。 佈局
除此以外,Intent還包含了以下三個方法。學習
setClass(Context packageContext, Class<?> cls):設置該 Intent 將要啓動的組件對應的類。優化
setClassName(Context packageContext, String className):設置該 Intent 將要啓動的組件對應的類名。this
setClassName(String packageName, String className):設置該 Intent 將要啓動的組件對應的類名。
指定Component屬性的Intent已經明確了它將要啓動哪一個組件,所以這種Intent也被稱爲顯式Intent,沒有指定Component屬性的Intent被稱爲隱式Intent。
下面的示例程序示範瞭如何經過顯式Intent (指定了 Component屬性)來啓動另外一個 Activity。該程序的界面佈局很簡單,界面中只有一個按鈕,用戶單擊該按鈕將會啓動第二個Activity。此處再也不給出該程序的界面佈局文件。該程序的Java代碼以下:
package com.jinyu.cqkxzsxy.android.intent.componentattr; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.start_btn); // 爲bn按鈕綁定事件監聽器 startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // 建立一個ComponentName對象 ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class); Intent intent = new Intent(); // 爲Intent設置Component屬性 intent.setComponent(comp); startActivity(intent); } }); } }
上面程序中的onClick回調方法裏面的代碼用於建立ComponentName對象,並將該對象設置成Intent 對象的Component屬性,這樣應用程序便可根據該Intent的意圖去啓動指定組件。 實際上,這幾行關鍵代碼徹底能夠簡化爲以下形式:
// 根據指定組件類來建立Intent
Intentintent=newIntent(MainActivity.this,SecondActivity.class);
startActivity(intent);
從上面的代碼能夠看出,當須要爲Intent設置Component屬性時,實際上Intent己經提供了一個簡化的構造器,這樣方便程序直接指定啓動其餘組件。
當程序經過Intent的Component屬性(明確指定了啓動哪一個組件)啓動特定組件時,被啓動組件幾乎不須要使用<intent-filter.../>進行配置。
程序的SecondActivity也很簡單,它的界面佈局中只包含一個簡單的文本框,用於顯示該 Activity對應的Intent的Component屬性的包名、類名。該Activity的Java代碼以下:
package com.jinyu.cqkxzsxy.android.intent.componentattr; import android.content.ComponentName; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); TextView showTv = (TextView) findViewById(R.id.show_tv); // 獲取該Activity對應的Intent的Component屬性 ComponentName comp = getIntent().getComponent(); // 顯示該ComponentName對象的包名、類名 showTv.setText("組件包名爲:" + comp.getPackageName() + "\n組件類名爲:" + comp.getClassName()); } }
運行上面的程序,經過第一個Activity中的按鈕進入第二個Activity中,將能夠看到下圖所示的界面。
Intent的Action屬性的值是一個普通的字符串,表明該Intent所要完成的一個抽象動做。
Action要完成的只是一個抽象動做,這個動做具體由哪一個組件(或許是Activity,或許是 BroadcastReceiver)來完成,Action這個字符串自己並無論。好比Android提供的標準Action: Intent.ACTION_VIEW,它只表示一個抽象的查看操做,但具體查看什麼、啓動哪一個Activity 來查看,Intent.ACTION_VIEW並不知道——這取決於Activity的<intent-filter.../>配置,只要某個Activity的<intent-filter.../>配置中包含了該ACTION_VIEW,該Actvitiy就有可能被啓動。
下面經過一個簡單的示例來示範Action屬性(就是普通字符串)的做用。下面程序的第一個Activity很是簡單,它只包括一個普通按鈕,當用戶單擊該按鈕時,程序會「跳轉」到第二個Activity。但第一個Activity指定跳轉的Intent時,並不指定要跳轉的目標Activity,而是爲Intent指定Action屬性。此處不給出界面佈局的代碼,第一個Activity 的Java代碼以下:
package com.jinyu.cqkxzsxy.android.intent.actionattr; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private static final String TEST_ACTION = "com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.start_btn); // 爲bn按鈕綁定事件監聽器 startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // 建立Intent對象 Intent intent = new Intent(); // 爲Intent設置Action屬性(屬性值就是一個普通字符串) intent.setAction(MainActivity.TEST_ACTION); startActivity(intent); } }); } }
上面程序中的onClick回調方法裏面的代碼指定了根據Intent來啓動Activity。但該Intent並未指定要啓動哪一個Activity,從上面程序中的代碼沒法看出該程序將要啓動哪一個Activity。那麼到底程序會啓動哪一個Activity呢?這取決於Activity配置中 <intent-fiIter.../>元素的配置。
<intent-filter.../>元素是 AndroidManifest.xml 文件中<activity.../>元素的子元素,前面已經學習過,<activity.../>元素用於爲應用程序配置 Activity,<activity.../>的<intent-filter.../>子元素則用於配置該Activity所能「響應」的Intent。
<intent-filter.../>元素裏一般可包含以下子元素。
0〜N個<action.../>子元素。
0〜N個<category…/>子元素。
0〜1個<data.../>子元素。
<action.../>、<category.../>子元素的配置很是簡單,它們均可指定android:name屬性,該屬性的值就是一個普通字符串。當<activity.../>元素的<intent-fiIter.../>子元素裏包含多個<action.../>子元素(至關於指定了多個字符串)時,就代表該Activity能響應Action屬性值爲其中任意一個字符串的Intent。
因爲上面的程序指定啓動Action屬性爲MainActivity.TEST_ACTION常量的 Activity,也就要求被啓動的 Activity 對應的配置元素的<intent-filter.../>元素裏至少包括一個<action.../>子元素。另外上面程序中的代碼並未指定目標Intent的Category屬性,但該Intent 已有一個值爲 android.intent.category.DEFAULT 的 Category 屬性值,所以被啓動 Activity 對應的配置元素的<intent-filter.../>元素裏至少還包括一個以下的<category.../>子元素。被啓動的Activity的完整配置以下:
<activity android:name=".SecondActivity"> <intent-filter> <!-- 指定該Activity能響應Action爲指定字符串的Intent --> <action android:name="com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION" /> <!-- 指定該Activity能響應Action屬性爲helloWorld的Intent --> <action android:name="helloWorld" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
上面Activity配置的代碼指定該Activity能響應具備指定Action屬性值、默認 Category屬性值的Intent。其中有一行代碼只是試驗用的,對於本程序沒有影響——它代表該Activity能響應Action屬性值爲helloWorld字符串、Category屬性值爲 android.intent.category.DEFAULT的Intent,但咱們的程序並何嘗試啓動這樣的Activity,能夠本身嘗試用這樣的Intent來啓動Activity,將會看到程序也會啓動該Activity。
上面的配置代碼中配置了一個實現類爲SecondActivity的Activity,所以程序還應該提供這個Activity代碼。代碼以下:
package com.jinyu.cqkxzsxy.android.intent.actionattr; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); TextView showTv = (TextView) findViewById(R.id.show_tv); // 獲取該Activity對應的Intent的Action屬性 String action = getIntent().getAction(); // 顯示Action屬性 showTv.setText("Action爲:" + action); } }
上面的程序代碼很簡單,它只是在啓動時把啓動該Activity的Intent的Action屬性值顯示在指定文本框內。
運行上面的程序,單擊程序中的「啓動指定 Action、默認Category對應的Activity」按鈕,將看到下圖所示界面。
實際上Android內部提供了大量標準的Action常量,其中用於啓動Activity的標準的Action常量及對應的字符串以下表所示。
Intent的Category屬性的值也是一個普通的字符串,用於爲Action增長額外的附加類別信息。一般Action 屬性與Category屬性結合使用。
一個Intent對象最多隻能包括一個Action屬性,程序可調用Intent的 setAction(String str)方法來設置Action屬性值;但一個Intent對象能夠包括多個Category屬性, 程序可調用Intent的addCategory (String str)方法來爲Intent添加Category屬性。當程序建立 Intent時,該Intent默認啓動Category屬性值爲Intent.CATEGORY_DEFAULT常量(常量值爲 android.intent.category.DEFAULT)的組件。
接下來的示例程序將會示範Category屬性的用法。該程序的第一個Activity的代碼以下:
package com.jinyu.cqkxzsxy.android.intent.categoryattr; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { private static final String TEST_ACTION = "com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION"; private static final String TEST_CATEGORY = "com.jinyu.cqkxzsxy.android.intent.category.TEST_CATEGORY"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.start_btn); // 爲bn按鈕綁定事件監聽器 startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // 建立Intent對象 Intent intent = new Intent(); // 爲Intent設置Action屬性(屬性值就是一個普通字符串) intent.setAction(MainActivity.TEST_ACTION); // 添加Category屬性 intent.addCategory(MainActivity.TEST_CATEGORY); startActivity(intent); } }); } }
上面程序中的onClick回調方法裏面的代碼指定了該Intent的Action屬性值爲com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION字符串,併爲該 Intent 添加 了 字符串爲com.jinyu.cqkxzsxy.android.intent.category.TEST_CATEGORY屬性。這意味着上面的程序所要啓動的目標Activity裏應該包含 <action.../> 子元素和<category.../>子元素。
下面是程序要啓動的目標Action所對應的配置代碼:
<activity android:name=".SecondActivity"> <intent-filter> <!-- 指定該Activity能響應action爲指定字符串的Intent --> <action android:name="com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION" /> <!-- 指定該Activity能響應category爲指定字符串的Intent --> <category android:name="com.jinyu.cqkxzsxy.android.intent.category.TEST_CATEGORY" /> <!-- 指定該Activity能響應category爲android.intent.category.DEFAULT的Intent --> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
上面配置Activity時也指定該Activity的實現類爲SecondActivity,該實現類的代碼以下:
package com.jinyu.cqkxzsxy.android.intent.categoryattr; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; import java.util.Set; public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); TextView showTv = (TextView) findViewById(R.id.show_tv); // 獲取該Activity對應的Intent的Action屬性 String action = getIntent().getAction(); // 獲取該Activity對應的Intent的Category屬性 Set<String> cates = getIntent().getCategories(); // 顯示Category屬性 showTv.setText("Action爲:" + action + "\nCategory屬性爲:" + cates); } }
上面的程序也很簡單,它只是在啓動時把啓動該Activity的Intent的Action、Catetory屬 性值分別顯示在不一樣的文本框內。
運行上面的程序,單擊程序中的「啓動指定Action、指定 Category對應的Activity」按鈕,將看到下圖所示的界面。
實際上Android內部也提供了大量標準的Catetory常量,其中標準的Category常量及對應的字符串以下表所示。
關於Intent的Component、Action、Category三個屬性先分享到這裏,若是還不夠熟悉,建議多加練習。
因爲內容較多,本期先學習到這裏,下期接着學習其餘四個屬性。
今天就先到這裏,若是有問題歡迎留言一塊兒探討,也歡迎加入Android零基礎入門技術討論微信羣,共同成長!
若是該系列分享對你有幫助,就動動手指關注、點贊、留言吧,你的互動就是對我最大的鼓勵!
此文章版權爲微信公衆號分享達人秀(ShareExpert)——鑫鱻全部,若需轉載請聯繫做者受權,特此聲明!
往期總結回顧:
Android零基礎入門第1節:Android的前世此生
Android零基礎入門第2節:Android 系統架構和應用組件那些事
Android零基礎入門第3節:帶你一塊兒來聊一聊Android開發環境
Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招
Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神
Android零基礎入門第6節:配置優化SDK Manager, 正式約會女神
Android零基礎入門第7節:搞定Android模擬器,開啓甜蜜之旅
Android零基礎入門第8節:HelloWorld,個人第一趟旅程出發點
Android零基礎入門第9節:Android應用實戰,不懂代碼也能夠開發
Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio
Android零基礎入門第11節:簡單幾步帶你飛,運行Android Studio工程
Android零基礎入門第12節:熟悉Android Studio界面,開始裝逼賣萌
Android零基礎入門第13節:Android Studio個性化配置,打造開發利器
Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代
Android零基礎入門第15節:掌握Android Studio項目結構,揚帆起航
Android零基礎入門第16節:Android用戶界面開發概述
Android零基礎入門第17節:文本框TextView
Android零基礎入門第18節:輸入框EditText
Android零基礎入門第19節:按鈕Button
Android零基礎入門第20節:複選框CheckBox和單選按鈕RadioButton
Android零基礎入門第21節:開關組件ToggleButton和Switch
Android零基礎入門第22節:圖像視圖ImageView
Android零基礎入門第23節:圖像按鈕ImageButton和縮放按鈕ZoomButton
Android零基礎入門第24節:自定義View簡單使用,打造屬於你的控件
Android零基礎入門第25節:簡單且最經常使用的LinearLayout線性佈局
Android零基礎入門第26節:兩種對齊方式,layout_gravity和gravity大不一樣
Android零基礎入門第27節:正確使用padding和margin
Android零基礎入門第28節:輕鬆掌握RelativeLayout相對佈局
Android零基礎入門第29節:善用TableLayout表格佈局
Android零基礎入門第30節:兩分鐘掌握FrameLayout幀佈局
Android零基礎入門第31節:少用的AbsoluteLayout絕對佈局
Android零基礎入門第32節:新推出的GridLayout網格佈局
Android零基礎入門第33節:Android事件處理概述
Android零基礎入門第34節:Android中基於監聽的事件處理
Android零基礎入門第35節:Android中基於回調的事件處理
Android零基礎入門第36節:Android系統事件的處理
Android零基礎入門第37節:初識ListView
Android零基礎入門第38節:初識Adapter
Android零基礎入門第39節:ListActivity和自定義列表項
Android零基礎入門第40節:自定義ArrayAdapter
Android零基礎入門第41節:使用SimpleAdapter
Android零基礎入門第42節:自定義BaseAdapter
Android零基礎入門第43節:ListView優化和列表首尾使用
Android零基礎入門第44節:ListView數據動態更新
Android零基礎入門第45節:網格視圖GridView
Android零基礎入門第46節:列表選項框Spinner
Android零基礎入門第47節:自動完成文本框AutoCompleteTextView
Android零基礎入門第48節:可摺疊列表ExpandableListView
Android零基礎入門第49節:AdapterViewFlipper圖片輪播
Android零基礎入門第50節:StackView卡片堆疊
Android零基礎入門第51節:進度條ProgressBar
Android零基礎入門第52節:自定義ProgressBar炫酷進度條
Android零基礎入門第53節:拖動條SeekBar和星級評分條RatingBar
Android零基礎入門第54節:視圖切換組件ViewSwitcher
Android零基礎入門第55節:ImageSwitcher和TextSwitcher
Android零基礎入門第56節:翻轉視圖ViewFlipper
Android零基礎入門第57節:DatePicker和TimePicker選擇器
Android零基礎入門第58節:數值選擇器NumberPicker
Android零基礎入門第59節:經常使用三大Clock時鐘組件
Android零基礎入門第60節:日曆視圖CalendarView和定時器Chronometer
Android零基礎入門第61節:滾動視圖ScrollView
Android零基礎入門第62節:搜索框組件SearchView
Android零基礎入門第63節:值得借鑑學習的選項卡TabHost
Android零基礎入門第64節:揭開RecyclerView廬山真面目
Android零基礎入門第65節:RecyclerView分割線開發技巧
Android零基礎入門第66節:RecyclerView點擊事件處理
Android零基礎入門第67節:RecyclerView數據動態更新
Android零基礎入門第68節:RecyclerView添加首尾視圖
Android零基礎入門第69節:ViewPager快速實現引導頁
Android零基礎入門第70節:ViewPager打造TabHost效果
Android零基礎入門第71節:CardView簡單實現卡片式佈局
Android零基礎入門第72節:SwipeRefreshLayout下拉刷新
Android零基礎入門第73節:Activity建立和配置
Android零基礎入門第74節:Activity啓動和關閉
Android零基礎入門第75節:Activity狀態和生命週期
Android零基礎入門第76節:Activity數據保存和橫豎屏切換
Android零基礎入門第77節:Activity任務棧和啓動模式
Android零基礎入門第78節:四大組件的紐帶——Intent