通信技術研發人員,AndroidUI高級之十六使用Intent進行通信

 2023-10-18 阅读 21 评论 0

摘要:本章內容 Intent詳解 通信技術研發人員? 調用系統程序 計算機高級篩選。 使用Intent實現組件間數據傳遞 定制Intent android.intent.category.DEFAULT。 Intent詳解 android Intent。 Intent是一種運行時綁定(run-time binding)機制,它能在程序運行過程

本章內容

Intent詳解

通信技術研發人員?

調用系統程序

計算機高級篩選。

使用Intent實現組件間數據傳遞

定制Intent

android.intent.category.DEFAULT。

Intent詳解

android 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進行注冊

Android終端。

Intent的構成,要在不同的activity之間傳遞數據,就要在intent中包含相應的內容,一般來說數據中最基本的應該包括:

?Action:用來指明要實施的動作是什么,比如說ACTION_VIEW, ACTION_EDIT等

android intent作用、

?Data: 要事實的具體的數據,一般由一個Uri變量來表示

android中間件、

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




轉載于:https://www.cnblogs.com/mjsn/p/6150826.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/146973.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息