(Android數據傳遞)Intent消息傳遞機制 “Intent”“數據傳遞”


Intent類的繼承關系:

 

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

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

使用Intent可以用來:

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

2. 啟動Activity或Service來執行一個動作的Intent,通常需要使用特定的數據,或者特定的數據執行動作(隱式:請求對一條數據執行某個動作);

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

Android通過廣播Intent來公布系統事件,比如網絡連接狀態或者電池電量的改變。本地Android應用程序簡單地注冊監聽特定的廣播Intent並作出相應的響應的組件。因此,可以通過注冊監聽相同的Broadcast Receiver來替換許多本地應用程序。

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類的構造方法

構造函數:

1、Intent() 空構造函數

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

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

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

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

6、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之前,用戶可以選擇其中的一個聯系人。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM