標籤:
Intent是應用程式之間通訊的重要媒介,Activity、Service、BroadcastReceiver都是依靠Intent來進行啟動的。
Intent對象大致包含了Component、Action、Category、Data、Type、Extra、Flag這七種屬性。
Component:用於確定指定需求啟動的目標組件
Action:代表該Intent所要完成的一個抽象動作
Category:用於為Action增加額外的附加類別資訊,通常Action會與Category結合使用
Data:通常用於向Action屬性提供操作的資料
Type:用於指定該Data所指定Uri對應的MIME類型
Extra:通常用於在多個Activity之間進行資料交換
Flag:用於為該Intent添加一些額外的控制旗標,Intent可調用addFlags()方法來為Intent添加控制旗標。
下面將介紹Intent對象各屬性的作用:
1.Component屬性
Intent的Component屬性需要接受一個ComponentName對象
// 建立一個ComponentName對象ComponentName comp = new ComponentName(MainActivity.this, TwoActivity.class);Intent intent = new Intent();// 為Intent設定Component屬性intent.setComponent(comp);// Intent intent = new Intent(MainActivity.this, TwoActivity.class);startActivity(intent);
下面來顯示Activity對應Intent的Component屬性的包名、類名
// 擷取該Activity對應的Intent的Component屬性ComponentName comp = getIntent().getComponent();// 顯示該ComponentName對象的包名、類名show.setText("組件包名為:" + comp.getPackageName() + "\n組件類名為:" + comp.getClassName());// 運行結果:組件包名為:com.gc.component// 組件類名為:com.gc.component.TwoActivity
2.Action、Category屬性和intent-filter配置
Android提供的標準Action:Intent.ACTION_VIEW(表示一個抽象的查看操作),具體查看什麼,啟動哪個Activity來查看取決於Activity的intent-filter配置中包含了該ACTION_VIEW,該Activity就有可能被啟動。
1)我們來實現一下點擊按鈕為Intent指定Action跳轉TwoActivity,如下:
// 建立Intent對象Intent intent = new Intent();// 為Intent設定Action屬性(屬性值就是一個一般字元串)intent.setAction("com.gc.intent.action.CRAZYIT_ACTION");startActivity(intent);
接下來配置intent-filter元素(用於配置Activity響應的Intent),intent-filter元素通常包括Action、Category、Data子項目
<activity android:name=".TwoActivity" android:label="@string/app_name"> <intent-filter> <!-- 指定該Activity能響應Action為指定字串的Intent --> <action android:name="com.gc.intent.action.CRAZYIT_ACTION" /> <!-- 指定該Activity能響應Action屬性為helloWorld的Intent --> <action android:name="helloWorld" /> <!-- 指定該Action能響應Category屬性為指定字串的Intent --> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></activity>
接下來我們在開啟的TwoActivity中擷取該Activity對應的Intent的Category屬性
Set<String> cates = getIntent().getCategories();
2)指定Action、Category調用系統Activity
Android內部提供了大量標準的Action、Category常量,其中用於啟動Activity的標準Action常量及對應的字串如下:
| Action常量 |
對應字串 |
簡單說明 |
| ACTION_MAIN |
android.intent.action.MAIN |
應用程式入口 |
| ACTION_VIEW |
android.intent.action.VIEW |
顯示指定資料 |
| ACTION_CHOOSER |
android.intent.action.CHOOSER |
顯示一個Activity選取器 |
| ACTION_GET_CONTENT |
android.intent.action.GET_CONTENT |
讓使用者選擇資料,並返回所選的資料 |
| ACTION_DIAL |
android.intent.action.DIAL |
顯示撥號面板 |
| ACTION_CALL |
android.intent.action.CALL |
直接向指定使用者撥打到電話 |
| ACTION_SEARCH |
android.intent.action.SEARCH |
執行搜尋 |
標準Category常量及對應字串如下:
| Category常量 |
對應字串 |
簡單說明 |
| CATEGORY_DEFAULT |
android.intent.category.DEFAULT |
預設Category |
| CATEGORY_BROWSABLE |
android.intent.category.BROWSABLE |
指定該Activity能被瀏覽器安全調用 |
| CATEGORY_TAB |
android.intent.category.TAB |
指定Activity作為TabActivity的Tab頁 |
| CATEGORY_LAUNCHER |
android.intent.category.LAUNCHER |
Activity顯示在頂級程式列表中 |
| CATEGORY_INFO |
android.intent.category.INFO |
用於提供包資訊 |
| CATEGORY_HOME |
android.intent.category.HOME |
設定該Activity隨系統啟動而運行 |
| CATEGORY_CAR_DOCK |
android.intent.category.CAR_DOCK |
指定手機被插入汽車硬體時運行該Activity |
| CATEGORY_DESK_DOCK |
android.intent.category.DESK_DOCK |
指定手機被插入案頭硬體時運行該Activity |
| CATEGORY_CAR_MODE |
android.intent.category.CAR_MODE |
指定該Activity可在車載環境下使用 |
3)我們設定一個按鈕,點擊將返回系統Home介面,按鈕的點擊事件如下:
// 建立Intent對象Intent intent = new Intent();// 為Intent設定Action、Category屬性intent.setAction(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);startActivity(intent);
3.Data、Type屬性
Data通常用於向Action屬性提供操作的資料,Type用於指定該Data所指定Uri對應的MIME類型。
1)Data和Type關係微妙,會相互覆蓋:
Intent先設定Data,後設定Type,那麼Data被覆蓋;Intent先設定Type,後設定Data,那麼Type被覆蓋;如果希望兩者都存在,則應調用Intent的setDataAndType()方法。
Data屬性接收一個Uri對象,一個Uri對象通常表示形式如下:
scheme://host:port/path// 例如:content://com.android.contacts/contacts/123
2)接下來使用Action、Data屬性啟動系統Activity瀏覽指定網頁,點擊事件如下:
// 建立IntentIntent intent = new Intent();String data = "http://www.126.com";// 根據指定字串解析出Uri對象Uri uri = Uri.parse(data);// 為Intent設定Action屬性intent.setAction(Intent.ACTION_VIEW);// 設定Data屬性intent.setData(uri);startActivity(intent);
本篇介紹總結了Android系統中Intent的功能和用法,當Activity應用需要啟動某個組件時,總需要藉助Intent來實現,還有啟動Service、BroadcastReceiver組件也都是由Intent來實現的。
Android開發實踐 Intent