Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> AndroidUI高級之十六使用Intent進行通信

AndroidUI高級之十六使用Intent進行通信

編輯:關於Android編程

本章內容

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可以獲得數據

//發送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中使用自定義屬性

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved