android Intent機制詳解

原文出處:http://blog.csdn.net/t12x3456/article/details/7688154


什么是Intent


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);


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,解析得到的目標組件必須至少包含這兩個類別。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python基本數據類型(四)-集合與運算符-python3筆記

1.集合 2.字典 3.運算符優先級 1.集合 創建&#xff1a;() set() 注意&#xff1a;創建空的集合要用set() 特點&#xff1a;元素唯一&#xff0c;無序 運算&#xff1a; &&#xff08;交集&#xff09; |&#xff08;并集&#xff09; -&#xff08;差集&#xff0…

Android的權限

Android有四種權限&#xff1a; 1、Permission 權限 2、Root權限 3、Bootloader的解鎖 4、Radio(基帶)解鎖 ------------------------------------ 1、Permission 我們在開發中經常使用到 Permission 權限&#xff0c;即一系列"Android.Permission.*"對象。…

hive2 java連接_用Java代碼通過JDBC連接Hiveserver2

1.在終端啟動hiveserver2#hiveserver22.使用beeline連接hive另外打開一個終端&#xff0c;輸入如下命令(xavierdb必須是已經存在的數據庫)#beeline -u jdbc:hive2://localhost:10000/xavierdb -n hive -p hive3.添加maven依賴org.apache.hivehive-jdbc1.1.0junitjunit4.9org.ap…

java 向上拋異常_Java 異常的處理方式throws

在昨天的文章《Java 異常的分類與處理》中我們簡單地了解了一下在方法聲明的位置上使用throws關鍵字向上拋出異常&#xff0c;下面深入講解異常的第一種處理方式throws。下面深入講解異常的第一種處理方式throws。看以下例子&#xff1a;import java.io.*;public class Excepti…

Jquery mobile 解決IOS9selectli閃退問題

升級IOS9后&#xff0c;JQuery mobile 出現了個bug問題。<select>&#xff0c;<ul><li></li></ul> 出現閃退。 解決方法&#xff1a; 必須加在 jquery.js 和 jquerymobile.js 中間 <script src"......../...../jquery-2.0.0.min.js&qu…

JAVA通過SSL證書創建MS AD賬戶及設置密碼

近期由于工作需要整理一下自動化的東西&#xff0c;因為公司去年上線了OA&#xff0c;所以公司的入職系統會提交用戶的信息到IT部門&#xff0c;最早的做法是入職到了&#xff0c;IT部門收集用戶信息在AD中創建對應的用戶信息&#xff0c;所以為了提高管理員的工作效率&#xf…

java 實體類規范_實體類的規范

1.Boolean類型1.1.使用Boolean類型,而不是Byte類型1.2.數據庫字段名使用is_開頭1.3.實體類字段名不使用is開頭例子/*** 是否為新消息*/Column(name "is_new_message", nullable false)private Boolean newMessage;2.Enum類型1.使用Convert注解, 并指定coverter類例…

01電話撥號器

實例非常簡單&#xff0c;意在體驗Android的Intent&#xff0c;用戶權限。 Intent 見 http://blog.csdn.net/zengmingen/article/details/49586045 用戶權限 見 http://blog.csdn.net/zengmingen/article/details/49586569 --------------------------------------------------…

微信小程序筆記六模塊化 —— module.exports

微信小程序中所有 js 文件作用域皆為獨立的&#xff0c;每一個 js 文件即為一個模塊。模塊與模塊之間的引用通過 module.exports 或 exports 對外暴露接口。 注意&#xff1a; exports 是 module.exports 的一個引用&#xff0c;因此在模塊里邊隨意更改 exports 的指向會造成未…

java常用的統計_(OJ)Java常用類-統計數字次數

統計數字次數Problem Description命令行輸入一個由數字組成的任意字符串,統計出每個數字出現的次數。Input Description1239586838Output Description0 counts:01 counts:12 counts:13 counts:24 counts:05 counts:16 counts:17 counts:08 counts:39 counts:1解題代碼import ja…

02發送短信

使用SmsManager發送短信java.lang.Object ?android.telephony.SmsManagerManages SMS operations such as sending data, text, and pdu SMS messages. Get this object by calling the static method SmsManager.getDefault().管理短信操作&#xff0c;如發送數據&#xff…

Python運行環境與異常處理

Python的命令格式&#xff1a; python [option] ... [-c cmd | -m mod | file | -] [arg] ... 選項描述-J 啟動將從Python3中刪除或更改某些功能的警告 -B阻止在導入時創建.pyc或.pyo文件-E忽略環境變量-h打印所有可用命令行選項的列表-i在程序執行后進入交互模式-m module以腳…

Java應用一般架構

原文鏈接&#xff1a;http://www.iteye.com/news/31115 當我們架設一個系統的時候通常需要考慮到如何與其他系統交互&#xff0c;所以我們首先需要知道各種系統之間是如何交互的&#xff0c;使用何種技術實現。 1. 不同系統不同語言之間的交互 現在我們常見的不同系統不同語…

Mac MongoDB未正常關閉導致重啟失敗

你可以刪除掉mongod.lock文件&#xff0c;然后重新啟動&#xff0c;如果還是不可以&#xff0c;你可以查看一下進程&#xff0c;然后殺掉&#xff1a; ps -aef | grep mongo sudo kill 1076 再重啟數據庫即可。

微信企業號讓IOS不要識別數字為電話號碼的方法

最近在開發一個聯系人查看功能時&#xff0c;發現IOS端把 8位&#xff0c;11位的數字識別為了 電話號碼。 本來是黑色的樣式&#xff0c;變成了藍色的樣式&#xff0c;還添加了下劃線。點擊一下&#xff0c;還可以撥打電話。 這個問題要改&#xff0c;解決方法很簡單&#xf…

powerdns與nginx結合實現以域名和IP方式訪問web服務器80端口時分別跳轉到不同頁面...

1.powerdns設置 2.內部網站介紹 web服務器采用nginx&#xff0c;內網dns采用powerdns. 想實現的功能如下 通過ip訪問時跳轉到A頁面&#xff0c;通過域名訪問時&#xff0c;讓其跳轉到B頁面。兩種方式的端口均為80. 頁面A對應的nginx配置 server { listen 80; …

Installation error code: -103簽名不一致錯誤

調用Android系統的PackageInstallerActivity進行app安裝時&#xff0c;報Installation error code: -103 錯誤。 原因是&#xff1a;簽名問題。 可能是 1、正安裝的應用沒用簽名 2、正安裝的應用與已安裝的應用包相同&#xff0c;但簽名不同。 解決方法&#xff1a; 1、給…

java代碼塊是對象嗎_面向對象(Java中普通代碼塊,構造代碼塊,靜態代碼塊區別及代碼示例)...

//靜態代碼塊:在java中使用static關鍵字聲明的代碼塊。靜態塊用于初始化類&#xff0c;為類的屬性初始化。每個靜態代碼塊只會執行一次。由于JVM在加載類時會執行靜態代碼塊&#xff0c;所以靜態代碼塊先于主方法執行。//如果類中包含多個靜態代碼塊&#xff0c;那么將按照&quo…

Android adb命令選擇設備操作

當開了多個模擬器時&#xff0c;安裝app需要指定虛擬機&#xff0c;否則會提示&#xff1a;error: more than one device and emulator 1、先adb devices 查看設備列表 List of devices attached emulator-5554 device emulator-5556 device 2、使用命令 adb -s emulat…

java 視圖解析器_SpringMVC——視圖和視圖解析器

請求處理方法執行完成后&#xff0c;最終返回一個 ModelAndView對象。對于那些返回 String&#xff0c;View 或 ModeMap 等類型的處理方法&#xff0c;Spring MVC 也會在內部將它們裝配成一個ModelAndView 對象&#xff0c;它包含了邏輯名和模型對象的視圖Spring MVC 借助視圖解…