91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Intent機制詳解

發布時間:2020-07-01 09:48:27 來源:網絡 閱讀:233 作者:JustMetU 欄目:移動開發

簡單來說,Intent是一種運行時綁定(run-time binding)機制,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意愿,Android會根據意愿的內容選擇適當的組件來完成請求。比如,有一個Activity希望打開網頁瀏覽器查看某一網頁的內容,那么這個Activity只需要發出WEB_SEARCH_ACTION給Android,Android就會根據Intent的請求內容,查詢各組件注冊時聲明的IntentFilter,找到網頁瀏覽器的Activity來瀏覽網頁。 

Android的三個基本組件——Activity,Service和Broadcast Receiver——都是通過Intent機制激活的,不同類型的組件有不同的傳遞Intent方式:


1.1 要激活一個新的Activity,或者讓一個現有的Activity做新的操作,可以通過調用Context.startActivity()或者Activity.startActivityForResult()方法。 

1.2 要啟動一個新的Service,或者向一個已有的Service傳遞新的指令,調用Context.startService()方法或者調用Context.bindService()方法將調用此方法的上下文對象與Service綁定。


1.3 Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()這三個方法可以發送Broadcast Intent。發送之后,所有已注冊的并且擁有與之相匹配IntentFilter的BroadcastReceiver就會被激活。 

Intent一旦發出,Android都會準確找到相匹配的一個或多個Activity,Service或者BroadcastReceiver作響應。所以,不同類型的Intent消息不會出現重疊,即Broadcast的Intent消息只會發送給BroadcastReceiver,而決不會發送給Activity或者Service。由startActivity()傳遞的消息也只會發給Activity,由startService()傳遞的Intent只會發送給Service。


Intent的構成


要在不同的activity之間傳遞數據,就要在intent中包含相應的內容,一般來說數據中最基本的應該包括:


Action:用來指明要實施的動作是什么,比如說ACTION_VIEW, ACTION_EDIT等。具體的可以查閱android SDK-> reference中的Android.content.intent類,里面的constants中定義了所有的action。


一些常用的Action:


ACTION_CALL activity 啟動一個電話.
ACTION_EDIT activity 顯示用戶編輯的數據.
ACTION_MAIN activity 作為Task中第一個Activity啟動
ACTION_SYNC activity 同步手機與數據服務器上的數據.
ACTION_BATTERY_LOW broadcast receiver 電池電量過低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳機警告
ACTION_SCREEN_ON broadcast receiver 屏幕變亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改變時區警告.


Data: 要事實的具體的數據,一般由一個Uri變量來表示

Category:一個字符串,包含了關于處理該intent的組件的種類的信息。一個intent對象可以有任意個category。intent類定義了許多category常數.

addCategory()方法為一個intent對象增加一個category,
removeCategory刪除一個category,
getCategories()獲取intent所有的category.


Type:顯式指定Intent的數據類型(MIME)(多用途互聯網郵件擴展,Multipurpose Internet Mail Extensions)。比如,一個組件是可以顯示圖片數據的而不能播放聲音文件。很多情況下,data類型可在URI中找到,比如content:開頭的URI,表明數據由設備上的content provider提供。但是通過設置這個屬性,可以強制采用顯式指定的類型而不再進行推導。


MIME類型有2種形式


1.1  單個記錄的格式: vnd.android.cursor.item/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains/122(一條列車信息的uri)的MIME類型是vnd.android.cursor.item/vnd.example.rail


1.2 多個記錄的格式:vnd.android.cursor.dir/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains (所有列車信息)的MIME類型是vnd.android.cursor.dir/vnd.example.rail


component:指定Intent的目標組件的類名稱。通常 Android會根據Intent 中包含的其它屬性的信息,比如action、data/type、category進行查找,最終找到一個與之匹配的目標組件。但是,如果 component這個屬性有指定的話,將直接使用它指定的組件,而不再執行上述查找過程。指定了這個屬性以后,Intent的其它所有屬性都是可選的。例如:

Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);

startActivity(it);


extras:附加信息,例如ACTION_TIMEZONE_CHANGED的intent有一個"time-zone"附加信息來指明新的時區,而ACTION_HEADSET_PLUG有一個“state”附加信息來指示耳機是被插入還是被拔出。intent對象有一系列put...()和set...()方法來設定和獲取附加信息。 這些方法和Bundle對象很像。事實上附加信息可以使用putExtras()和getExtras()作為Bundle來讀和寫。例如:


//用Bundle傳遞數據 Intent it = new Intent(Activity.Main.this, Activity2.class); Bundle bundle=new Bundle(); bundle.putString("name", "This is from MainActivity!"); it.putExtras(bundle); startActivity(it); //獲得數據 Bundle bundle=getIntent().getExtras(); String name=bundle.getString("name");


intent的解析:

在應用中,我們可以以兩種形式來使用Intent:


1.1 顯式Intent:指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應用啟動對應的組件。

2.2 隱式Intent:沒有指定comonent屬性的Intent。這些Intent需要包含足夠的信息,這樣系統才能根據這些信息,在在所有的可用組件中,確定滿足此Intent的組件。
對于直接Intent,Android不需要去做解析,因為目標組件已經很明確,Android需要解析的是那些間接Intent,通過解析將 Intent映射給可以處理此Intent的Activity、Service或Broadcast Receiver。

Intent解析機制

Intent解析機制主要是通過查找已注冊在AndroidManifest.xml中的所有<intent-filter>及其中定義的Intent,通過PackageManager(注:PackageManager能夠得到當前設備上所安裝的
application package的信息)來查找能處理這個Intent的component。在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進行判斷的,判斷方法如下:
1.1  如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;
1.2  如果Intent沒有提供type,系統將從data中得到數據類型。和action一樣,目標組件的數據類型列表中必須包含Intent的數據類型,否則不能匹配。
1.3  如果Intent中的數據不是content:類型的URI,而且Intent也沒有明確指定type,將根據Intent中數據的scheme(比如 http:或者mailto:)進行匹配。同上,Intent 的scheme必須出現在目標組件的scheme列表中。
1.4 如果Intent指定了一個或多個category,這些類別必須全部出現在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。


向AI問一下細節
推薦閱讀:
  1. intent使用
  2. Intent解析

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

合作市| 兴城市| 吴川市| 华宁县| 铁岭市| 浙江省| 长乐市| 诸暨市| 和平区| 扎鲁特旗| 厦门市| 武清区| 西青区| 景谷| 新绛县| 桃江县| 新晃| 平湖市| 兴安县| 大庆市| 宜君县| 蛟河市| 洪江市| 荥经县| 千阳县| 前郭尔| 康保县| 克什克腾旗| 友谊县| 晋州市| 卓尼县| 孝感市| 宜丰县| 化德县| 安康市| 武鸣县| 翁牛特旗| 萨嘎县| 信阳市| 禄劝| 桂林市|