首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AndroidUI高级之十六使用Intent进行通信

AndroidUI高级之十六使用Intent进行通信

作者头像
张哥编程
发布2024-12-17 15:05:37
发布2024-12-17 15:05:37
6510
举报
文章被收录于专栏:云计算linux云计算linux

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可以获得数据

代码语言:javascript
复制
<span >//发送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调用系统对象

代码语言:javascript
复制
<span >Uri uri = Uri.parse( "http://www.google.com");  
Intent it  = new  Intent(Intent.ACTION_VIEW,uri);  </span>

显示地图

代码语言:javascript
复制
<span > Uri uri = Uri.parse( "geo:38.899533,-77.036476" );  
  Intent it = new  Intent(Intent.Action_VIEW,uri);  
</span>

调用拨号程序

代码语言:javascript
复制
<span > Uri uri = Uri.parse( "tel:xxxxxx" );  
  Intent it = new  Intent(Intent.Action_DIAL,uri);  
</span>

注意:拨打电话需要在配置文件中赋予权限

代码语言:javascript
复制
<span > <uses-permission 
        android:name="android.permission.CALL_PHONE"/> 
</span>

使用Intent实现数据传递 在启动组件时,都需要通过Intent传递启动信息 Intent正是一个可以用来传递数据的媒介

代码语言:javascript
复制
<span >Intent  it = new Intent(this, SettingActivity.class);
it.putExtra(“username”, “root”);
startActivity(it);
</span>

在被启动的组件中,可以通过getIntent方法获得Intent对象

代码语言:javascript
复制
<span >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为返回的数据 接收数据返回 启动者的启动调用示例

代码语言:javascript
复制
<span >startActivityForResult (intent, REQUEST_CODE);</span>

启动者的回调接收示例

代码语言:javascript
复制
<span >protected void onActivityResult(int  requestCode, 
        int resultCode, Intent  data) {
        if(requestCode == REQUEST_CODE) {
                if(resultCode == RESULT_OK) {
                        data.getExtras().getString(“someresult”);
                }
        }
}
</span>

接收数据返回 被启动者设置回调结果示例

代码语言:javascript
复制
<span >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中使用自定义属性

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档