Android手機軟件開發中,Intent作為手機軟件開發時很重要的對象需要引起我們的重視,實際上,intent也是體現Android開發具有其獨特性的一個標志性的對象。
當一個Activity要啟動另外一個Activity的時候,也許一個以前較為熟悉的模式是:調用一個new函數,直接創建具有窗口特征類的對象,又或者直接調用一個啟動函數來啟動。這種方式簡潔、明了,但是卻違背了Android開發的理念。Android使用Intent來“封裝”程序的“調用意圖”,不管程序想啟動什麼組件,啟動一個Activity也好,一個service也好,或者一個Broadcast Receiver也好,Android統一使用Intent對象來封裝這種“啟動意圖”。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11
除此之外,使用Intent也有好處,某些時候,應用程序只是想啟動具有某些特征的組件或者應用程序,卻並不想和這類程序有硬性的代碼耦合;另外,應用程序有時候或許只是知道要啟動的東西的一些特征,並不知道要啟動的程序具體指的是什麼(比如,某程序想啟動發短信的應用程序,而此時系統中存在多個發信息的軟件,我們無法知道要打開什麼軟件),此時程序要做的就應該是發送一個啟動短信應用程序的意圖,而不是指定要打開什麼軟件。當然更一般的,Intent也可以指定打開那個應用程序,而與一些程序有硬性的耦合關系。
Intent還是應用程序組件之間通信的重要媒介,兩個Activity把需要交換的數據封裝成Bundle對象,然後使用Intent來攜帶Bundle對象,這樣就實現了兩個Activity之間的數據交換。
Intent存在以下幾個屬性:Component,Action,Category,Data,Type,Extra,Flag七個屬性,其中Component屬性用來指定需要啟動的目標組件,Extra屬性用於攜帶需要交換的數據。
下面對Intent對象做詳細的介紹:
1. Intent的Component屬性
Component是用來指定啟動目標組件的屬性,標准的啟動代碼如下:
ComponentName comp = new ComponentName(firstActivity.this,secondActivity.class);
Intent intent = new Intent();
Intent. setComponent(comp);
startActivity(intent);
以上代碼用來標准的創建ComponentName對象,進而調用Intent對象的setComponent()函數來為Intent設定相應的componentName,最後調用startAcitvity函數啟動一個新的Activity。
實際上,當需要為Intent設定Component屬性的時候,Intent已經為我們提供了一個簡單的構造器,使用方法如下(我們經常使用的方式):
Intent intent = new Intent(firstActivity.this,senondActivity.class);
值得一提的是,在secondActivity組件中,可以使用getIntent()方法取得調用次組件的Intent對象,進而,getXXX方法在這裡就可以各種使用了。
2. Intent 的Action與Category屬性
Action和Category屬性都是普通的字符串,其中Action代表了抽象出來的“動作”,Category屬性用來和Action屬性配合使用,表達出要啟動某組件的意圖。
具有<intent-filter…/>標簽的Activity均有可能會被啟動。
比如:
Public final staticString SOME_ACTION = “org.someaction.SOME_ACTION”
// 這是一個字符轉,隨便設定,但是一般都具有一些抽象的語義。
在這個Activity種的某個按鈕的onClick()方法中加入:
Intent intent = newIntent();
Intent.setAction(thisActivity.SOME_ACTION);
startActivity(intent);
這樣的代碼並沒有具體指出要啟動哪個Activity,這樣就脫離了“硬編碼”,但是具體要啟動哪個Activity呢,這將取決於Activity配置文件中的<intent-filter…/>標簽。
<intent-filter…/>是AndroidManifest.xml文件中<activity…/>元素的子元素,需要做的,就是給你實際需要相應這個意圖的Activity添加<intent-filter…/>標簽,在<intent-filter…/>下,存在著三種標簽:1.<action…/>2.<category…/>3.<data…/>,其中指定android:name屬性之後,這個activity便具有了相應上面意圖的屬性了。
對於上面的意圖,則添加這樣的代碼(當然要在<intent-filter…/>標簽下):
<action android:name = “org.someaction.SOME_ACTION”/>
需要一提的是:一個Intent對象最多只能包含一個Activity屬性,程序調用setAction(Stringstr)來設定Action的屬性值;而一個Activity可以有多個Category屬性,程序可以調用addCategory(String str)來添加Category屬性。當程序創建Intent的時候,創建的Intent屬性自動啟動屬性值為Intent.CATEGORY_DEFAULT常量,其值為“android.intent.category.DEFAULT”,所以,在配置某個Activity屬性的時候<categoryandroid:name = “andrid.intent.category.DEFAULT ”>是可以添加到配置文件當中的。
實際上Android內部提供了大量的標准的Action和Category常量。
總結如下:
Action常量
對應的android:name 設定
簡單說明
ACTION_MAIN
Android.intent.action.MAIN
應用程序入口
ACTION_VIEW
Android.intent.action.VIEW
顯示指定數據
ACTION_ATTACH_DATA
Android.intent.action.ATTACH_DATA
指定某模塊數據被附加的地方
ACTION_EDIT
Android.intent.action.EDIT
編輯指定數據
ACTION_PICK
Android.intent.action.PICK
從列表中選擇某項並返回所選數據
ACTION_CHOOSER
Android.intent.action.CHOOSER
顯示一個Activity選擇器
ACTION_GET_CONTENT
Android.intent.action.GET_CONTENT
讓用戶選擇數據,並返回所選
ACTION_DIAL
Android.intent.action.DIAL
顯示撥號面板
ACTION_SEND
Android.intent.action.SEND
直接發送數據
ACTION_SENDTO
Android.intent.action.SENDTO
直接發送消息
ACTION_ANSWER
Android.intent.action.ANSWER
應答電話
ACTION_INSERT
Android.intent.action.INSERT
插入數據
ACTION_DELETE
Android.intent.action.DELETE
刪除數據
ACTION_RUN
Android.intent.action.RUN
運行數據
ACTION_SYNC
Android.intent.action.SYNC
執行數據同步
ACTION_PICK_ACTIVITY
Android.intent.action.PICK_ACTIVITY
用於選擇activity
ACTION_SEARCH
Android.intent.action.SEARCH
執行搜索
ACTION_WEB_SEARCH
Android.intent.action. WEB_SEARCH
直徑web搜索
ACTION_ FACTORY_TEST
Android.intent.action.FACTORY_TEST
工廠測試入口點
這裡僅僅摘錄一些,如果想了解全部的ACTION,可以直接查看Android的標准API中有關Intent的說明部分。