(Android數據傳遞)Intent消息傳遞機制 「Intent」「數據傳遞」

Intent類的繼承關係:java

 

須要注意的是,該類實現了Parcelable(用於數據傳遞)和Cloneable接口.數據庫

Intent是一種(系統級別的)消息傳遞機制,能夠在應用程序內使用,也能夠在應用程序間使用。編程

使用Intent能夠用來:數組

1. 使用類名,顯式啓動一個特定的Service或Activity(顯式);網絡

2. 啓動Activity或Service來執行一個動做的Intent,一般須要使用特定的數據,或者特定的數據執行動做(隱式:請求對一條數據執行某個動做);數據結構

3. 廣播某個事件已經發生;異步

Android經過廣播Intent來公佈系統事件,好比網絡鏈接狀態或者電池電量的改變。本地Android應用程序簡單地註冊監聽特定的廣播Intent並做出相應的響應的組件。所以,能夠經過註冊監聽相同的Broadcast Receiver來替換許多本地應用程序。ide

Intent支持Android設備上安裝的任意應用程序組件之間的交互,無論它們是哪一個應用程序的一部分都是如此。這就把設備從一個包含相互獨立的組件集合的平臺變成了一個互聯的系統,進而能夠基於內部的、系統的或者第三方應用程序的事件建立事件驅動的應用程序。模塊化

使用Intent來傳播動做(甚至在同一個應用程序內傳播動做),而不是顯式地加載類,這是一條基本的Android設計原則(模塊化原則)。它鼓勵組件之間的分離,容許無縫地替換應用程序元素。還提供了一個簡單的用戶擴展應用程序功能的模型的基礎。函數

當建立一個新的隱式的Intent時,須要指定一個要執行的動做,另外,也能夠提供執行那個動做須要的數據的URI。還能夠經過向Intent添加extra來向目標Activity發送額外的數據。Extra是一種向Intent附加基本類型值的機制。Extra做爲一個Bundle對象存儲在Intent中,可使用getExtras方法檢索。

在本身的應用程序中利用第三方應用程序的Activity和Service是十分方便的,可是,沒法保證用戶設備上安裝了特定的某個應用程序,或者設備上有可以處理你的請求的應用程序。所以,在調用startActivity以前,肯定調用是否能夠解析爲一個Activity是一種很好的作法。

Intent是一種異步消息機制

解釋:

1. Intent是不一樣組件之間相互通信的紐帶,封裝了不一樣組件之間通信的條件;一個Intent對象表達一個目的或指望,敘述其所指望的服務或動做、與動做相關的數據等。Android系統則根據此對象之敘述,負責匹配並找到相匹配的組件,而後將Intent對象傳遞給目標組件;相似於「媒婆」的做用。

2. Intent對象有三種用途:跳轉活動、發送廣播和開啓(綁定)服務。

3. Intent的數據結構,在一個Intent實例中,主要包含有:action、data(動做涉及的數據)、category、type、component、extra(附加數據)六個部分。

4. Intent Resolution Android系統中的Intent解決方案有兩種:顯式和隱式。

對於每種組件來講,激活的方法是不一樣的:

1.經過傳遞一個Intent對象至 Context.startActivity()或Activity.startActivityForResult()以載入(或指定新工做給)一個activity。相應的activity能夠經過調用 getIntent() 方法來查看激活它的intent。Android經過調用activity的onNewIntent()方法來傳遞給它繼發的intent。

一個activity常常啓動了下一個。若是它指望它所啓動的那個activity返回一個結果,它會以調用startActivityForResult()來取代startActivity()。好比說,若是它啓動了另一個activity以使用戶挑選一張照片,它也許想知道哪張照片被選中了。結果將會被封裝在一個Intent對象中,並傳遞給發出調用的activity的onActivityResult() 方法。

2.經過傳遞一個Intent對象至Context.startService()將啓動一個服務(或給予正在運行的服務以一個新的指令)。Android調用服務的onStart()方法並將Intent對象傳遞給它。

與此相似,一個Intent能夠被調用組件傳遞給 Context.bindService()以獲取一個正在運行的目標服務的鏈接。這個服務會經由onBind() 方法的調用獲取這個Intent對象(若是服務還沒有啓動,bindService()會先啓動它)。好比說,一個activity能夠鏈接至前述的音樂回放服務,並提供給用戶一個可操做的(用戶界面)以對回放進行控制。這個activity能夠調用 bindService() 來創建鏈接,而後調用服務中定義的對象來影響回放。

3.應用程序能夠憑藉將Intent對象傳遞給 Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它相似方法來產生一個廣播。Android會調用全部對此廣播有興趣的廣播接收器的 onReceive()方法將intent傳遞給它們。Broadcast Intent用於向監聽器通知系統的應用程序或應用程序事件,從而能夠擴展應用程序間的事件驅動的編程模型。

綜上所述,有如下三種狀況:

Intent的啓動方式---兩種解決方案

1.顯式方式。直接設置目標組件的ComponentName,用於一個應用內部的消息傳遞,好比啓動另外一個Activity或者一個services。

2.隱式方式。ComponentName爲空,用於調用其餘應用中的組件。須要包含足夠的信息,這樣系統才能根據這些信息使用intent filter在全部的組件中過濾action、data或者category來匹配目標組件。

Intent類中包含的內部類:Intent.FilterComparison和Intent.ShortcutIconResource。

Intent數據結構

1. componentName(組件名稱),指定Intent的目標組件的類名稱。組件名稱是可選的,若是填寫,Intent對象會發送給指定組件名稱的組件,不然也能夠經過其餘Intent信息定位到適合的組件。組件名稱是個ComponentName類型的對象。

Intent intent = new Intent(); 
// 構造的參數爲當前Context和目標組件的類路徑名 
ComponentName cn = new ComponentName(HelloActivity.this, "com.byread.activity.OtherActivity"); 
intent.setComponent(cn); 
startActivity(intent);

至關於經常使用方法:

Intent intent = new Intent();
intent.setClass(HelloActivity.this, OtherActivity.class);
startActivity(intent);

2. action(動做),指定Intent的執行動做,好比調用撥打電話組件。

3. data(數據),起到表示數據和數據MIME類型的做用。不一樣的action是和不一樣的data類型配套的,經過設置data的Uri來得到。

4. category(類別),被執行動做的附加信息。例如應用的啓動Activity在intent-filter中設置category。

5. extras(附加信息),爲處理Intent組件提供附加的信息。可經過putXX()和getXX()方法存取信息;也能夠經過建立Bundle對象,再經過putExtras()和getExtras()方法來存取。

6. flags(標記),指示Android如何啓動目標Activity,設置方法爲調用Intent的setFlags方法。

Android SDK中可使用的Android原生動做,都是Intent類中的靜態字符串常量。在建立隱式的Intent來啓動應用程序內的Activity或者子Activity的時候,可使用這些動做(ActivityIntent)。

ACTION_ALL_APPS:打開一個列出全部已安裝應用程序的Activity。

ACTION_BUG_REPORT:顯示一個能夠報告bug的Activity。

ACTION_ANSWER:打開一個處理來電的Activity,一般這個動做是由本地電話撥號程序進行處理的。

...

對於第一種用途,即便用startActivity(Intent)時,可用的 Standard Activities Actions 有:

ACTION_TIME_TICK

ACTION_TIME_CHANGED

ACTION_TIMEZONE_CHANGED

ACTION_BOOT_COMPLETED

ACTION_PACKAGE_ADDED

ACTION_PACKAGE_CHANGED

ACTION_PACKAGE_REMOVED

ACTION_PACKAGE_RESTARTED

ACTION_PACKAGE_DATA_CLEARED

ACTION_UID_REMOVED

ACTION_BATTERY_CHANGED

ACTION_POWER_CONNECTED

ACTION_POWER_DISCONNECTED

ACTION_SHUTDOWN

Intent實例中定義的Action字段信息,主要用於Intent的匹配,指向了Intent的走向。Android系統會根據Intent實例設置的Action進行信息匹配,以此執行相應的內容。(Android系統負責「配對」,找出與Intent相配的組件)

(使用Intent來廣播事件)除了這些Activity動做以外,Android還包含了不少廣播動做,它們用來建立廣播Intent以公佈系統事件(使用sendBroadcast發送出去,Intent實例則是一封信)。

對於第二種用途,使用registerReceiver(BroadcastReceiver, IntentFilter)或者使用<receiver>標籤時,可用的 Standard Broadcast Actions 有:

ACTION_TIME_TICK

ACTION_TIME_CHANGED

ACTION_TIMEZONE_CHANGED

ACTION_BOOT_COMPLETED

ACTION_PACKAGE_ADDED

ACTION_PACKAGE_CHANGED

ACTION_PACKAGE_REMOVED

ACTION_PACKAGE_RESTARTED

ACTION_PACKAGE_DATA_CLEARED

ACTION_UID_REMOVED

ACTION_BATTERY_CHANGED

ACTION_POWER_CONNECTED

ACTION_POWER_DISCONNECTED

ACTION_SHUTDOWN

能夠對Intent的動做、數據和分類進行設置,從而使Broadcast Receiver可以精確地肯定它們的需求。在這種方案中,Intent動做字符串能夠用來標識要廣播的事件,因此它應該是可以標識事件的惟一的字符串。習慣上,動做字符的使用與包名相同的構建方式。

public static final String NEW_LIFEFORM_DETECTED="com.paad.action.NEW_LIFEFORM";

標準的 Categories ,用於區分不一樣類型的Intent實例,使用addCategory(String)聲明,Standard Categories 有如下幾類:

CATEGORY_DEFAULT

CATEGORY_BROWSABLE

CATEGORY_TAB

CATEGORY_ALTERNATIVE

CATEGORY_SELECTED_ALTERNATIVE

CATEGORY_LAUNCHER

CATEGORY_INFO

CATEGORY_HOME

CATEGORY_PREFERENCE

CATEGORY_TEST

CATEGORY_CAR_DOCK

CATEGORY_DESK_DOCK

CATEGORY_LE_DESK_DOCK

CATEGORY_HE_DESK_DOCK

CATEGORY_CAR_MODE

CATEGORY_APP_MARKET

此外,Intent的Extra字段附帶信息,使用putExtra(String, Bundle)添加Extra字段信息,Standard Extra Data 有如下幾類:

EXTRA_ALARM_COUNT

EXTRA_BCC

EXTRA_CC

EXTRA_CHANGED_COMPONENT_NAME

EXTRA_DATA_REMOVED

EXTRA_DOCK_STATE

EXTRA_DOCK_STATE_HE_DESK

EXTRA_DOCK_STATE_LE_DESK

EXTRA_DOCK_STATE_CAR

EXTRA_DOCK_STATE_DESK

EXTRA_DOCK_STATE_UNDOCKED

EXTRA_DONT_KILL_APP

EXTRA_EMAIL

EXTRA_INITIAL_INTENTS

EXTRA_INTENT

EXTRA_KEY_EVENT

EXTRA_ORIGINATING_URI

EXTRA_PHONE_NUMBER

EXTRA_REFERRER

EXTRA_REMOTE_INTENT_TOKEN

EXTRA_REPLACING

EXTRA_SHORTCUT_ICON

EXTRA_SHORTCUT_ICON_RESOURCE

EXTRA_SHORTCUT_INTENT

EXTRA_STREAM

EXTRA_SHORTCUT_NAME

EXTRA_SUBJECT

EXTRA_TEMPLATE

EXTRA_TEXT

EXTRA_TITLE

EXTRA_UID

使用setFlags(int)和addFlags(int)設置Intent的Flag參數:

FLAG_GRANT_READ_URI_PERMISSION

FLAG_GRANT_WRITE_URI_PERMISSION

FLAG_GRANT_PERSISTABLE_URI_PERMISSION

FLAG_GRANT_PREFIX_URI_PERMISSION

FLAG_DEBUG_LOG_RESOLUTION

FLAG_FROM_BACKGROUND

FLAG_ACTIVITY_BROUGHT_TO_FRONT

FLAG_ACTIVITY_CLEAR_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

FLAG_ACTIVITY_FORWARD_RESULT

FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

FLAG_ACTIVITY_MULTIPLE_TASK

FLAG_ACTIVITY_NEW_DOCUMENT

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_NO_ANIMATION

FLAG_ACTIVITY_NO_HISTORY

FLAG_ACTIVITY_NO_USER_ACTION

FLAG_ACTIVITY_PREVIOUS_IS_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_REORDER_TO_FRONT

FLAG_ACTIVITY_SINGLE_TOP

FLAG_ACTIVITY_TASK_ON_HOME

FLAG_RECEIVER_REGISTERED_ONLY

Intent類的構造方法

構造函數:

一、Intent() 空構造函數

二、Intent(Intent o) 拷貝構造函數

三、Intent(String action) 指定action類型的構造函數

四、Intent(String action, Uri uri) 指定Action類型和Uri的構造函數,URI主要是結合程序之間的數據共享ContentProvider

五、Intent(Context packageContext, Class<?> cls) 傳入組件的構造函數,是最常使用的方式(顯示指定跳轉目的地)

六、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前兩種結合體

其中所指定的action字段值,就是AndroidManifest.xml文件聲明activity所用的<intent-filter>標籤中的action值。

使用Intent實例進行數據傳遞:

Bundle bundle = new Bundle();
bundle.putStringArray("NAMEARR", nameArr);
Intent intent = new Intent(Main.this, CountList.class);
intent.putExtras(bundle);
startActivity(intent);

其中nameArr則是字符串數組,使用Intent實例傳遞數據,藉助了Bundle對象。

Bundle bundle = this.getIntent().getExtras();
String[] arrName = bundle.getStringArray("NAMEARR");

接收數據時,使用與之對應的方法,實現Activity之間的數據傳遞。

Android SDK 的開發者文檔在講述該類時,最早講述的是其中的常量字段值,以及其含義。

putExtra:將數據以key:value的形式放入一個Parcelable對象中,直接由Intent對象攜帶,適合少許數據。只是用來設定各類不一樣類型的附加數據。不被系統用來尋找匹配目標組件。

setData:將數據以數據流的方式傳輸,Intent接收後再單獨接收Data部分,適合數據量較大的數據傳輸,如文件或圖片等。傳入的是Uri,用於數據的過濾。setData能夠被系統用來尋找匹配目標組件。

// 增長Intent附加值 Action:0

it.setAction(String.valueOf(0));

it.setClass(IndexActivity.this, SptActivity.class);

startActivity(it);

有什麼用途?

public Intent setClassName (Context packageContext, String className) 啓動本應用中的Activity或Service

public Intent setClassName (String packageName, String className) 啓動其餘應用中的Activity或Service

Sticky Intent的不一樣特色? https://my.oschina.net/ososchina/blog/347765 粘性Intent

Pending Intent的不一樣特色?

實例分析,建立新的Activity爲聯繫人數據的ACTION_PICK動做提供服務。該界面將顯示聯繫人數據庫中的每個聯繫人信息,並在關閉而且將其URI返回給調用它的Activity以前,用戶能夠選擇其中的一個聯繫人。

相關文章
相關標籤/搜索