Android Intent 用法总结
?
From:https://www.jianshu.com/p/67d99a82509b
?
Android 中提供了 Intent 機(jī)制來協(xié)助應(yīng)用間的交互與通訊,Intent 負(fù)責(zé)對應(yīng)用中一次操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android 則根據(jù)此 Intent 的描述,負(fù)責(zé)找到對應(yīng)的組件,將 Intent 傳遞給調(diào)用的組件,并完成組件的調(diào)用。Intent 不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi)部的 Activity / Service之間的交互。因此,Intent 在這里起著一個(gè)媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
相信對于學(xué)習(xí)Android的人來說Intent并不陌生,最常使用的就是它的跳轉(zhuǎn)Activity和在Activity之間傳值的功能。
?
?
1. Intent 作用
?
Intent是一個(gè)將要執(zhí)行的動(dòng)作的抽象的描述,一般來說是作為參數(shù)來使用,由 Intent來協(xié)助完成 Android各個(gè)組件之間的通訊。比如說調(diào)用startActivity()來啟動(dòng)一個(gè)Activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver,再或者由startService() / bindservice()來啟動(dòng)一個(gè)后臺的 service。所以可以看出來,Intent 主要是用來啟動(dòng)其他的 activity 或者 service,所以可以將 intent 理解成 activity 之間的粘合劑。
Intent 作用的表現(xiàn)形式為:
- 啟動(dòng)Activity
通過Context.startActvity() / Activity.startActivityForResult()啟動(dòng)一個(gè)Activity; - 啟動(dòng)Service
通過Context.startService()啟動(dòng)一個(gè)服務(wù),或者通過Context.bindService()和后臺服務(wù)交互; - 發(fā)送Broadcast
通過廣播方法Context.sendBroadcasts() / Context.sendOrderedBroadcast() / Context.sendStickyBroadcast()發(fā)給Broadcast Receivers
?
?
2. Intent 種類
?
顯式Intent定義:對于明確指出了目標(biāo)組件名稱的 Intent,我們稱之為顯式Intent。
隱式Intent定義:對于沒有明確指出目標(biāo)組件名稱的 Intent,則稱之為隱式Intent。
?
2.1 顯式Intent
顯式,即直接指定需要打開的activity對應(yīng)的類。
1)構(gòu)造方法傳入Component,最常用的方式:
Intent intent = new Intent(this, SecondActivity.class); startActivity(intent);2)setComponent方法
Intent intent = new Intent(); intent.setClass(this, SecondActivity.class); //或者intent.setClassName(this, "com.example.app.SecondActivity"); //或者intent.setClassName(this.getPackageName(),"com.example.app.SecondActivity"); startActivity(intent);3)setClass / setClassName方法
Intent intent = new Intent(); intent.setClass(this, SecondActivity.class); //或者intent.setClassName(this, "com.example.app.SecondActivity"); //或者intent.setClassName(this.getPackageName(),"com.example.app.SecondActivity"); startActivity(intent);顯式Intent通過Component可以直接設(shè)置需要調(diào)用的Activity類,可以唯一確定一個(gè)Activity,意圖特別明確,所以是顯式的。設(shè)置這個(gè)類的方式可以是Class對象(如SecondActivity.class),也可以是包名加類名的字符串(如"com.example.app.SecondActivity")。
?
2.2 隱式Intent
隱式,不明確指定啟動(dòng)哪個(gè)Activity,而是設(shè)置Action、Data、Category,讓系統(tǒng)來篩選出合適的Activity。篩選是根據(jù)所有的<intent-filter>來篩選。
下面以Action為例:
AndroidManifest.xml文件中,首先被調(diào)用的Activity要有一個(gè)帶有<intent-filter>并且包含<action>的Activity,設(shè)定它能處理的Intent,并且category設(shè)為"android.intent.category.DEFAULT"。action的name是一個(gè)字符串,可以自定義,例如這里設(shè)成為"mark":
然后,在MainActivity,才可以通過這個(gè)action name找到上面的Activity。下面兩種方式分別通過setAction和構(gòu)造方法方法設(shè)置Action,兩種方式效果相同。
1)setAction方法
2)構(gòu)造方法直接設(shè)置Action
Intent intent = new Intent("mark"); startActivity(intent);為了防止應(yīng)用程序之間互相影響,一般命名方式是包名+Action名,例如這里命名"mark"就很不合理了,就應(yīng)該改成"com.example.app.Test"。
?
?
3. Intent屬性
?
Intent 對象大致包括7大屬性:Action(動(dòng)作)、Data(數(shù)據(jù))、Category(類別)、Type(數(shù)據(jù)類型)、Component(組件)、Extra(擴(kuò)展信息)、Flag(標(biāo)志位)。其中最常用的是Action屬性和Data屬性。
- Action:用來表現(xiàn)意圖的行動(dòng)
一個(gè)字符串變量,可以用來指定Intent要執(zhí)行的動(dòng)作類別。常見的action有:
Activity Actions:
| ACTION_MAIN | 表示程序入口 |
| ACTION_VIEW | 自動(dòng)以最合適的方式顯示Data |
| ACTION_EDIT | 提供可以編輯的 |
| ACTION_PICK | 選擇一個(gè)一條Data,并且返回它 |
| ACTION_DAIL | 顯示Data指向的號碼在撥號界面Dailer上 |
| ACTION_CALL | 撥打Data指向的號碼 |
| ACTION_SEND | 發(fā)送Data到指定的地方 |
| ACTION_SENDTO | 發(fā)送多組Data到指定的地方 |
| ACTION_RUN | 運(yùn)行Data,不管Data是什么 |
| ACTION_SEARCH | 執(zhí)行搜索 |
| ACTION_WEB_SEARCH | 執(zhí)行網(wǎng)上搜索 |
| ACRION_SYNC | 執(zhí)同步一個(gè)Data |
| ACTION_INSERT | 添加一個(gè)空的項(xiàng)到容器中 |
Broadcast Actions:
| ACTION_TIME_TICK | 當(dāng)前時(shí)間改變,并即時(shí)發(fā)送時(shí)間,只能通過系統(tǒng)發(fā)送。調(diào)用格式"android.intent.action.TIME_TICK" |
| ACTION_TIME_CHENGED | 設(shè)置時(shí)間。調(diào)用格式"android.intent.action.TIME_SET" |
-
Data:表示與動(dòng)作要操縱的數(shù)據(jù)
一個(gè)URI對象是一個(gè)引用的data的表現(xiàn)形式,或是data的MIME類型;data的類型由Intent的action決定。 -
Category:用來表現(xiàn)動(dòng)作的類別
一個(gè)包含Intent額外信息的字符串,表示哪種類型的組件來處理這個(gè)Intent。任何數(shù)量的Category 描述都可以添加到Intent中,但是很多intent不需要category,下面列舉一些常用的category:
| CATEGORY_DEFAULT | 把一個(gè)組件Component設(shè)為可被implicit啟動(dòng)的 |
| CATEGORY_LAUNCHER | 把一個(gè)action設(shè)置為在頂級執(zhí)行。并且包含這個(gè)屬性的Activity所定義的icon將取代application中定義的icon |
| CATEGORY_BROWSABLE | 當(dāng)Intent指向網(wǎng)絡(luò)相關(guān)時(shí),必須要添加這個(gè)類別 |
| CATEGORY_HOME | 使Intent指向Home界面 |
| CATEGORY_PREFERENCE | 定義的Activity是一個(gè)偏好面板Preference Panel |
-
Type:指定數(shù)據(jù)類型
一般Intent的數(shù)據(jù)類型能夠根據(jù)數(shù)據(jù)本身進(jìn)行判定,但是通過設(shè)置這個(gè)屬性,可以強(qiáng)制采用顯式指定的類型而不再進(jìn)行推導(dǎo)。 -
Component:目的組件
指定Intent的目標(biāo)組件名稱,當(dāng)指定了這個(gè)屬性后,系統(tǒng)將跳過匹配其他屬性,而直接匹配這個(gè)屬性來啟動(dòng)對應(yīng)的組件。 -
Extra:擴(kuò)展信息
Intent可以攜帶的額外 key-value 數(shù)據(jù),你可以通過調(diào)用putExtra()方法設(shè)置數(shù)據(jù),每一個(gè) key對應(yīng)一個(gè) value數(shù)據(jù)。你也可以通過創(chuàng)建 Bundle對象來存儲(chǔ)所有數(shù)據(jù),然后通過調(diào)用putExtras()方法來設(shè)置數(shù)據(jù)。
| EXTRA_BCC | 存放郵件密送人地址的字符串?dāng)?shù)組 |
| EXTRA_CC | 存放郵件抄送人地址的字符串?dāng)?shù)組 |
| EXTRA_EMAIL | 存放郵件地址的字符串?dāng)?shù)組 |
| EXTRA_SUBJECT | 存放郵件主題字符串 |
| EXTRA_TEXT | 存放郵件內(nèi)容 |
| EXTRA_KEY_EVENT | 以KeyEvent對象方式存放觸發(fā)Intent 的按鍵 |
| EXTRA_PHONE_ NUMBER | 存放調(diào)用ACTION_CALL 時(shí)的電話號碼 |
- Flag:期望這個(gè)意圖的運(yùn)行模式
用來指示系統(tǒng)如何啟動(dòng)一個(gè)Activity,可以通過setFlags()或者addFlags()可以把標(biāo)簽flag用在Intent中。
| FLAG_ACTIVITY_CLEAR_TOP | 相當(dāng)于SingleTask |
| FLAGE_ACTIVITY_SINGLE_TOP | 相當(dāng)于SingleTop |
| FLAG_ACTIVITY_NEW_TASK | 類似于SingleInstance |
| FLAG_ACTIVITY_NO_HISTORY | 當(dāng)離開該Activity后,該Activity將被從任務(wù)棧中移除 |
?
?
4. Intent用法
?
- 調(diào)用撥號程序
- 發(fā)送短信或彩信
- 通過瀏覽器打開網(wǎng)頁
- 發(fā)送電子郵件
- 顯示地圖與路徑規(guī)劃
- 播放多媒體
- 選擇圖片
- 拍照
- 獲取并剪切圖片
- 打開手機(jī)應(yīng)用市場
- 安裝程序
- 卸載程序
- 進(jìn)入設(shè)置界面
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Android Intent 用法总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CompletableFuture详解~
- 下一篇: OllyDBG完美教程(超强入门级)