Android應用開發—Intent組件詳解

轉載自:Android中Intent組件詳解

Intent是不同組件之間相互通訊的紐帶,封裝了不同組件之間通訊的條件。

Intent本身是定義為一個類別(Class),一個Intent對象表達一個目的(Goal)或期望(Expectation),敘述其所期望的服務或動作、與動作有關的數據等。Android則根據此Intent對象之敘述,負責配對,找出相配的組件,然后將 Intent對象傳遞給所找到的組件,Android的媒婆任務就完成了。

在Google Doc中是這樣描述Intent的(摘自Android中文翻譯組)

當接收到ContentResolver發出的請求后,內容提供者被激活。而其它三種組件──activity、服務和廣播接收器被一種叫做intent的異步消息所激活。intent是一個保存著消息內容的Intent對象。對于activity和服務來說,它指明了請求的操作名稱以及作為操作對象的數據的URI和其它一些信息。比如說,它可以承載對一個activity 的請求,讓它為用戶顯示一張圖片,或者讓用戶編輯一些文本。而對于廣播接收器而言,Intent對象指明了聲明的行為。比如,它可以對所有感興趣的對象聲明照相按鈕被按下。

對于每種組件來說,激活的方法是不同的:

  • 通過傳遞一個Intent對象至Context.startActivity()或Activity.startActivityForResult()以載入(或指定新工作給)一個activity。相應的activity可以通過調用 getIntent() 方法來查看激活它的intent。Android通過調用activity的onNewIntent()方法來傳遞給它繼發的intent。
    一個activity經常啟動了下一個。如果它期望它所啟動的那個activity返回一個結果,它會以調用startActivityForResult()來取代startActivity()。比如說,如果它啟動了另外一個activity以使用戶挑選一張照片,它也許想知道哪張照片被選中了。結果將會被封裝在一個Intent對象中,并傳遞給發出調用的activity的onActivityResult() 方法。
  • 通過傳遞一個Intent對象至Context.startService()將啟動一個服務(或給予正在運行的服務以一個新的指令)。Android調用服務的onStart()方法并將Intent對象傳遞給它。
    與此類似,一個Intent可以被調用組件傳遞給 Context.bindService()以獲取一個正在運行的目標服務的連接。這個服務會經由onBind() 方法的調用獲取這個Intent對象(如果服務尚未啟動,bindService()會先啟動它)。比如說,一個activity可以連接至前述的音樂回放服務,并提供給用戶一個可操作的(用戶界面)以對回放進行控制。這個activity可以調用 bindService() 來建立連接,然后調用服務中定義的對象來影響回放。
  • 應用程序可以憑借將Intent對象傳遞給 Context.sendBroadcast() ,Context.sendOrderedBroadcast(), 以及Context.sendStickyBroadcast()和其它類似方法來產生一個廣播。Android會調用所有對此廣播有興趣的廣播接收器的 onReceive()方法將intent傳遞給它們。

Intent對象包含的內容
在Intent類的Java源代碼中定義了Intent相關內容的變量,如下:

// Action  
private String mAction;  
// Data  
private Uri mData;  
private String mType;  
private String mPackage;  
// ComponentName  
private ComponentName mComponent;  
// Flag  
private int mFlags;  
// category  
private HashSet<String> mCategories;  
// extras  
private Bundle mExtras; 
  • 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);

Intent類中也包含一個初始化ComponentName的構造函數:

public Intent(Context packageContext, Class<?> cls) {  mComponent = new ComponentName(packageContext, cls);  
} 
  • action(動作), 指定Intent的執行動作,比如調用撥打電話組件。
public Intent(String action) {  mAction = action;  
}  
  • data(數據),起到表示數據和數據MIME類型的作用。不同的action是和不同的data類型配套的,通過設置data的Uri來獲得。
public Intent(String action, Uri uri) {  mAction = action;  mData = uri;  
} 

比如調用撥打電話組件:

Uri uri = Uri.parse("tel:10086");  
// 參數分別為調用撥打電話組件的Action和獲取Data數據的Uri  
Intent intent = new Intent(Intent.ACTION_DIAL, uri);  
startActivity(intent);
  • category(類別),被執行動作的附加信息。例如應用的啟動Activity在intent-filter中設置category。
<intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  
</intent-filter>  
  • extras(附加信息),為處理Intent組件提供附加的信息。可通過putXX()和getXX()方法存取信息;也可以通過創建Bundle對象,再通過putExtras()和getExtras()方法來存取。

  • flags(標記),指示Android如何啟動目標Activity,設置方法為調用Intent的setFlags方法。常用的Flags參數有:

FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_NO_HISTORY
FLAG_ACTIVITY_SINGLE_TOP 

Intent的投遞

  • 顯式方式:直接設置目標組件的ComponentName,用于一個應用內部的消息傳遞,比如啟動另一個Activity或者一個services。
    通過Intent的setComponent和setClass來制定目標組件的ComponentName。

  • 隱式方式:ComponentName為空,用于調用其他應用中的組件。需要包含足夠的信息,這樣系統才能根據這些信息使用intent filter在所有的組件中過濾action、data或者category來匹配目標組件。可參考Android中Activity組件詳解(5.Activity的Intent Filter)
    如果Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;
    如果Intent沒有提供type,系統將從data中得到數據類型。和action一樣,目標組件的數據類型列表中必須包含Intent的數據類型,否則不能匹配;
    如果Intent中的數據不是content: 類型的URI,而且Intent也沒有明確指定它的type,將根據Intent中數據的scheme (比如 http: 或者mailto: ) 進行匹配。同上,Intent 的scheme必須出現在目標組件的scheme列表中;
    如果Intent指定了一個或多個category,這些類別必須全部出現在組建的類別列表中。比如 Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。

Intent調用常見系統組件

// 調用瀏覽器  
Uri webViewUri = Uri.parse("http://blog.csdn.net/zuolongsnail");  
Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);  // 調用地圖  
Uri mapUri = Uri.parse("geo:100,100");  
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);  // 播放mp3  
Uri playUri = Uri.parse("file:///sdcard/test.mp3");  
Intent intent = new Intent(Intent.ACTION_VIEW, playUri);  
intent.setDataAndType(playUri, "audio/mp3");  // 調用撥打電話  
Uri dialUri = Uri.parse("tel:10086");  
Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);  
// 直接撥打電話,需要加上權限<uses-permission id="android.permission.CALL_PHONE" />  
Uri callUri = Uri.parse("tel:10086");  
Intent intent = new Intent(Intent.ACTION_CALL, callUri);  // 調用發郵件(這里要事先配置好的系統Email,否則是調不出發郵件界面的)  
Uri emailUri = Uri.parse("mailto:zuolongsnail@163.com");  
Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);  
// 直接發郵件  
Intent intent = new Intent(Intent.ACTION_SEND);  
String[] tos = { "zuolongsnail@gmail.com" };  
String[] ccs = { "zuolongsnail@163.com" };  
intent.putExtra(Intent.EXTRA_EMAIL, tos);  
intent.putExtra(Intent.EXTRA_CC, ccs);  
intent.putExtra(Intent.EXTRA_TEXT, "the email text");  
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");  
intent.setType("text/plain");  
Intent.createChooser(intent, "Choose Email Client");  // 發短信  
Intent intent = new Intent(Intent.ACTION_VIEW);  
intent.putExtra("sms_body", "the sms text");  
intent.setType("vnd.android-dir/mms-sms");  
// 直接發短信  
Uri smsToUri = Uri.parse("smsto:10086");  
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);  
intent.putExtra("sms_body", "the sms text");  
// 發彩信  
Uri mmsUri = Uri.parse("content://media/external/images/media/23");  
Intent intent = new Intent(Intent.ACTION_SEND);  
intent.putExtra("sms_body", "the sms text");  
intent.putExtra(Intent.EXTRA_STREAM, mmsUri);  
intent.setType("image/png");  // 卸載應用  
Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);  
Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);  
// 安裝應用  
Intent intent = new Intent(Intent.ACTION_VIEW);  
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");  // 在Android Market中查找應用  
Uri uri = Uri.parse("market://search?q=憤怒的小鳥");           
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  

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

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

相關文章

angularjs 結構的兩種寫法(2)

app.js里面 route.js 本項目中的路由寫法,路由的意思是&#xff1a;對應的跳轉頁面路徑&#xff0c;比如此處當路由是member.user-statisttic時&#xff0c;是會跳轉到url&#xff1a;http://.../user-statisttic.html頁面&#xff0c;然后此頁面對應的ctrl會解析也頁面的參數。…

Linux指令小記(簡明實用)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、ls指令,用于列出當前目錄的文件 通過添加-l參數可以使文件以詳情模式列出 通過添加-a參數可以將包含隱藏文件在內的全部文件列出。…

python之glob的用法

目錄 獲取特定擴展名的所有文件 獲取特定目錄下的所有文件 遞歸獲取所有文件 轉義特殊字符 iglob glob 是 Python 中用于文件模式匹配的一個模塊。它使用 Unix shell-style 的通配符來進行匹配&#xff0c;并返回所有匹配的文件路徑列表。 下面是一些 glob 的基本用法&am…

設置Eclipse中的字符集為UTF-8

Eclipse 修改字符集 默認情況下 Eclipse 字符集為 GBK&#xff0c;但現在很多項目采用的是 UTF-8&#xff0c;這是我們就需要設置我們的 Eclipse 開發環境字符集為 UTF-8&#xff0c; 設置步驟如下&#xff1a; 在菜單欄選擇 Window -> Preferences -> General -> Wor…

換位思考的最高境界是換待遇,所以,換位思考就是空話!!!

換位思考的最高境界是換待遇&#xff0c;所以&#xff0c;換位思考就是空話&#xff01;&#xff01;&#xff01; 換位思考是件說難也難&#xff0c;說容易也容易的事情。 如果你肯把你的工資待遇財富地位跟李彥宏互換一下&#xff0c;你就可以輕松理解他到底為什么非要在百度…

一個記錄最近搜索歷史的LRU實現

對于很多有搜索需求的功能&#xff0c;一般需要展示下最近n次的歷史搜索記錄&#xff0c;主要有以下幾個功能點&#xff1a; 最近搜索條目放在最前面&#xff0c;最早的搜索記錄放在最后。只記錄最近n條數據&#xff0c;如果超過n條搜索記錄&#xff0c;刪除搜索時間最久遠的記…

Python數據可視化2018:數據可視化庫為什么這么多?

本文最初發布于Anaconda開發者博客&#xff0c;經原作者授權由InfoQ中文站翻譯并分享。 在奧斯汀舉行的SciPy 2018年特別會議上&#xff0c;大量開源Python可視化工具的代表分享了他們對Python數據可視化未來的展望。我們看到了Matplotlib、Plotly、VisPy等許多庫的更新。我作為…

Oulipo (KMP出現次數)

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter e. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis su…

從夫妻吵架中看項目管理

從夫妻吵架中看項目管理&#xff08;很有意思的文章&#xff09; 首先要說明&#xff1a;和老婆吵架無論原因如何&#xff0c;無論結果如何你都是錯的&#xff0c;老婆永遠是對的。但是我不是神仙&#xff0c;偶爾也要吵架。但是如何讓吵架也發揮作用&#xff0c;增進夫妻感情&…

SpringMVC工作原理

大家好&#xff0c;我是IT修真院深圳分院第十一期學員&#xff0c;一枚正直純潔善良的JAVA程序員。 今天給大家分享一下&#xff0c;修真院官網JAVA任務二的一個知識點&#xff1a;SpringMVC工作原理 1、背景介紹 一&#xff1a;背景介紹 JavaWeb經歷的幾個變化&#xff1a; 1:…

Android應用開發—如何解決handler的警告:Handler Class Should be Static or Leaks Occur

轉自android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的時候&#xff0c;我是這樣寫的&#xff1a; public class SampleActivity extends Activity {private final Handler mLeakyHandler new Handler() {Overridepublic void hand…

從遠程(包括ftp,http等協議)地址獲取文件流信息

URL url new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg"); MultipartFile multipartFile new MockMultipartFile(fileName,fileName,"", url.openStream());轉載于:https://www.cnblogs.com/baihaojie/p/10331134…

shell 數組

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1&#xff09;定義數組&#xff1a; my_array(1 2 3 4) 也可這樣賦值&#xff1a;my_array[4]愛 讀取&#xff1a; echo ${my_array[2]…

nodejs 實現文件拷貝

通過4中不通的方式實現對一個文件的拷貝 方式一&#xff1a;readFile 異步一次性讀取文件再寫入 //異步形式讀取文件 function copyFile(url){const extName path.extname(url)const fileName path.basename(url)const dirName path.dirname(url)fs.readFile(url, (err, dat…

國家部委對4G調研:未定給中電信聯通發放牌照

一場有關4G牌照發放的論戰正在發酵&#xff0c;矛盾的核心在于&#xff0c;除了中移動外&#xff0c;政府是否也會向中電信和聯通發放TD-LTE(中國主導的4G標準)牌照 記者 王云輝 雍忠瑋 一場圍繞4G的新博弈已經白熱化。 “多個國家部委正在對4G展開全面調研&#xff0c;但最終如…

Luogu4735 最大異或和

題目藍鏈 Description 給你一個序列&#xff0c;你需要支持以下兩個操作&#xff1a; A x: 在序列尾部添加一個整數\(x\)&#xff0c;序列的長度增加\(1\)Q l r x: 詢問操作&#xff0c;你需要找到一個位置\(p \in [l, r]\)&#xff0c;使得&#xff1a;\(x \bigoplus a_p \big…

Spring-jdbc:JdbcTemplate使用簡介

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 為了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此建立一個JDBC存取框架. 作為 SpringJDBC 框架的核心, JDBC 模板…

Java多線程編程:變量共享分析(Thread)

Java多線程編程&#xff1a;變量共享分析&#xff08;Thread&#xff09; Java 創建線程的兩種方法 此處只簡單講下自己對java多線程變量共享的理解&#xff1a; 按照進程和多線程的原理&#xff0c;同一進程內的多個線程之間的地址空間是共享的&#xff08;除去ThreadLocal&a…

嘉益仕(Litns)帶您讀懂MES系統:選型篇

自從智能制造概念提出以來&#xff0c;制造執行系統MES在國內掀起了新一波的熱潮。眾多企業在技術發展、政策導向和自身需要的推動下&#xff0c;紛紛上馬MES請添加鏈接描述項目。 由此也帶動了MES軟件開發企業的快速發展。一夜之間MES軟件開發企業遍地開花&#xff0c;MES產品…