視頻課:https://edu.csdn.net/course/play/7621
本章內容
Intent詳解
調用系統程序
使用Intent實現組件間數據傳遞
定製Intent
Intent詳解
Intent是一種運行時綁定(run-time binding)機制,它能在程序運行過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來完成請求。
Android的三個基本組件——Activity,Service和Broadcast Receiver——都是通過Intent機制激活的,不同類型的組件有不同的傳遞Intent方式。要激活一個新的Activity,或者讓一個現有的Activity做新的操作,可以通過調用Context.startActivity()或者Activity.startActivityForResult()方法,要啓動一個新的Service,或者向一個已有的Service傳遞新的指令,調用Context.startService()方法或者調用Context.bindService()方法將調用此方法的上下文對象與Service綁定。
Intent稱爲意圖,用於描述一次操作的動作、參數以及附加的數據,用於很多地方,可以理解類似於網頁之間的超鏈接。
•查看某聯繫人的資料
•發郵件給某個人
•給某人打電話
Android會根據Intent尋找到相應的組件並傳入Intent執行
Intent可以在如下動作時被傳入
•Content.startActivity()
•Content.startService()
•Content.sendBroadcast()
Android中的組件需要在AndroidManifest.xml中註冊才能被調用
•通過intent-filter進行註冊
Intent的構成,要在不同的activity之間傳遞數據,就要在intent中包含相應的內容,一般來說數據中最基本的應該包括:
•Action:用來指明要實施的動作是什麼,比如說ACTION_VIEW, ACTION_EDIT等
•Data: 要事實的具體的數據,一般由一個Uri變量來表示
•Category:一個字符串,包含了關於處理該intent的組件的種類的信息。一個intent對象可以有任意個category。intent類定義了許多category常數
•Type:顯式指定Intent的數據類型(MIME)
•component:指定Intent的目標組件的類名稱
•extras:附加信息
幾種常見的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屬性用於與Action進行匹配
屬性值通常爲URI格式的字符串
不同的Action所對應的Data屬性內容也各不相同
•ACTION_CALL所對應的Data通常是“tel:”開頭的
•ACTION_VIEW對應的Data通常是“http:”開頭的
Data屬性的值可以通過如下方法設置
•setData() 只能設置URI
•setType() 只能設置MIME Type
•setDataAndType() 可以設置URI或MIME Type
Category用於描述目標組件的擴展類型信息
可以設置任意的描述
Intent類定義了幾種Category常量
•CATEGORY_BROWSABLE
•CATEGROY_HOME
•CATEGORY_LAUNCHER
Category屬性的值可以通過如下方法設置
•addCategory()
•removeCategory()
Extras用於表達鍵值對的數據
•可以隨意設置多對鍵值對
•這個屬性與Android匹配Intent無關
•Intent提供了多個相對的get……方法和set……方法用於讀寫數據
•當傳入到組件中時,通過Bundle的getExtras可以獲得數據
<span style="font-family:SimSun;font-size:14px;">//發送MMSUri uri = Uri.parse("content://media/external/images/media/23");Intent it = new Intent(Intent.ACTION_SEND);it.putExtra("sms_body", "some text");it.putExtra(Intent.EXTRA_STREAM, uri);it.setType("image/png");startActivity(it);</span>
Intent的使用有兩種形式
顯示Intent:明確定義了目標組件的名稱。通過指定具體的組件類,通知應用啓動對應的組件。
隱式Intent:沒有指定組件名稱屬性的Intent。通過屬性和Intent-Filter進行匹配。
Intent的工作原理
1、調用者生成Intent對象,並設置相關屬性
2、向Android提交Intent請求
3、Android對Intent進行解析,找到相應的組件執行
•這裏可以匹配多個組件
•通過Intent-Filter匹配時,Android選擇三個要素
Action
Data
Category
所有組件都通過在AndroidManifest.xml中的配置進行註冊
•一個沒有註冊Intent-Filter的組件只能響應顯式Intent請求
•以申明瞭Intent-Filter即可響應顯式請求也可以響應隱式請求
使用Intent調用系統對象
<span style="font-family:SimSun;font-size:14px;">Uri uri = Uri.parse( "http://www.google.com");Intent it = new Intent(Intent.ACTION_VIEW,uri); </span>
顯示地圖
<span style="font-family:SimSun;font-size:14px;"> Uri uri = Uri.parse( "geo:38.899533,-77.036476" ); Intent it = new Intent(Intent.Action_VIEW,uri);</span>
調用撥號程序
<span style="font-family:SimSun;font-size:14px;"> Uri uri = Uri.parse( "tel:xxxxxx" ); Intent it = new Intent(Intent.Action_DIAL,uri);</span>
注意:撥打電話需要在配置文件中賦予權限
<span style="font-family:SimSun;font-size:14px;"> <uses-permission android:name="android.permission.CALL_PHONE"/></span>
使用Intent實現數據傳遞
在啓動組件時,都需要通過Intent傳遞啓動信息
Intent正是一個可以用來傳遞數據的媒介
<span style="font-family:SimSun;font-size:14px;">Intent it = new Intent(this, SettingActivity.class);it.putExtra(“username”, “root”);startActivity(it);</span>
在被啓動的組件中,可以通過getIntent方法獲得Intent對象
<span style="font-family:SimSun;font-size:14px;">Intent it = getIntent();String username = it.getExtras().getString(“username”);</span>
接收數據返回
被啓動的組件結束時,需要將數據返回給調用者,通過Activity.startActivityForResult啓動Activity
public void startActivityForResult (Intent intent, int requestCode)
•參數intent爲啓動Activity的意圖描述
•參數requestCode爲請求碼,用於在回調時識別回調者
通過Activity.setResult設置返回信息
public void setResult (int resultCode, Intent data)
•參數resultCode爲返回結果的結果編碼,用於標識結果類型
•參數data爲返回的數據
接收數據返回
啓動者的啓動調用示例
<span style="font-family:SimSun;font-size:14px;">startActivityForResult (intent, REQUEST_CODE);</span>
啓動者的回調接收示例
<span style="font-family:SimSun;font-size:14px;">protected void onActivityResult(int requestCode, int resultCode, Intent data) {if(requestCode == REQUEST_CODE) {if(resultCode == RESULT_OK) {data.getExtras().getString(“someresult”);}}}</span>
接收數據返回
被啓動者設置回調結果示例
<span style="font-family:SimSun;font-size:14px;">Bundle bundle = new Bundle();bundle.putString(“someresult”, “somevalue”);bundle.putString(“otherresult”, “othervalue”);Intent it = new Intent();it.putExtra(bundle);setResult(RESULT_OK, it);finish();</span>
定製Intent和Intent-Filter
在需要啓動另一個自定義項目中的Activity時
•由於另一個項目的Activity不屬於當前項目,不能得到Class
•所以我們希望能夠通過隱式Intent的方式啓動
•這時就需要對Action等屬性進行自定義
•並在Intent中使用這些自定義屬性
Android中是允許Intent的自定義要求的
•首先在AndroidManifest.xml中使用Intent-Filter自定義各種屬性
•然後在啓動Activity時,在Intent中使用自定義屬性