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

視頻課: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中使用自定義屬性






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章