編輯:關於Android編程
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可以獲得數據
//發送MMS
Uri 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);
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調用系統對象
Uri uri = Uri.parse( "http://www.google.com");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
顯示地圖
Uri uri = Uri.parse( "geo:38.899533,-77.036476" );
Intent it = new Intent(Intent.Action_VIEW,uri);
調用撥號程序
Uri uri = Uri.parse( "tel:xxxxxx" );
Intent it = new Intent(Intent.Action_DIAL,uri);
注意:撥打電話需要在配置文件中賦予權限
使用Intent實現數據傳遞
在啟動組件時,都需要通過Intent傳遞啟動信息
Intent正是一個可以用來傳遞數據的媒介
Intent it = new Intent(this, SettingActivity.class);
it.putExtra(“username”, “root”);
startActivity(it);
在被啟動的組件中,可以通過getIntent方法獲得Intent對象
Intent it = getIntent();
String username = it.getExtras().getString(“username”);
接收數據返回
被啟動的組件結束時,需要將數據返回給調用者,通過Activity.startActivityForResult啟動Activity
public void startActivityForResult (Intent intent, int requestCode)
?參數intent為啟動Activity的意圖描述
?參數requestCode為請求碼,用於在回調時識別回調者
通過Activity.setResult設置返回信息
public void setResult (int resultCode, Intent data)
?參數resultCode為返回結果的結果編碼,用於標識結果類型
?參數data為返回的數據
接收數據返回
啟動者的啟動調用示例
startActivityForResult (intent, REQUEST_CODE);
啟動者的回調接收示例
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
if(requestCode == REQUEST_CODE) {
if(resultCode == RESULT_OK) {
data.getExtras().getString(“someresult”);
}
}
}
接收數據返回
被啟動者設置回調結果示例
Bundle bundle = new Bundle();
bundle.putString(“someresult”, “somevalue”);
bundle.putString(“otherresult”, “othervalue”);
Intent it = new Intent();
it.putExtra(bundle);
setResult(RESULT_OK, it);
finish();
定制Intent和Intent-Filter
在需要啟動另一個自定義項目中的Activity時
?由於另一個項目的Activity不屬於當前項目,不能得到Class
?所以我們希望能夠通過隱式Intent的方式啟動
?這時就需要對Action等屬性進行自定義
?並在Intent中使用這些自定義屬性
Android中是允許Intent的自定義要求的
?首先在AndroidManifest.xml中使用Intent-Filter自定義各種屬性
?然後在啟動Activity時,在Intent中使用自定義屬性
/***@author StormMaybin*@Date 2016-09-1*/ 生命不息,奮斗不止!WebView 對於,WebView 顧名思義,就是顯示各種各樣的
目前,市場上很多Android手機軟件都具有清理SD卡緩存的功能,比如360,金山等等。那麼這些軟件是如何實現清理sd卡緩存數據功能的呢?下面,我就給大家演示下,這些功能
1.自定義控件時鐘的布局和Java類values文件下的attrs.xml <!--?xml version="1.0" encoding=&q
前言 為了保證每周一篇的進度,又由於Vitamio新版本沒有發布, 決定推遲本地播放的一些功能(截圖、視頻時間、尺寸等),跳過直接寫在線播放部分的章節。從V