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

举报
tea_year 发表于 2021/12/30 00:34:52 2021/12/30
【摘要】 视频课:https://edu.csdn.net/course/play/7621 本章内容 Intent详解 调用系统程序 使用Intent实现组件间数据传递 定制Intent Intent详解 Int...


视频课: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可以获得数据


  
  1. <span style="font-family:SimSun;font-size:14px;">//发送MMS
  2. Uri uri = Uri.parse("content://media/external/images/media/23");
  3. Intent it = new Intent(Intent.ACTION_SEND);
  4. it.putExtra("sms_body", "some text");
  5. it.putExtra(Intent.EXTRA_STREAM, uri);
  6. it.setType("image/png");
  7. startActivity(it);
  8. </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调用系统对象


  
  1. <span style="font-family:SimSun;font-size:14px;">Uri uri = Uri.parse( "http://www.google.com");
  2. Intent it = new Intent(Intent.ACTION_VIEW,uri); </span>

显示地图

  
  1. <span style="font-family:SimSun;font-size:14px;"> Uri uri = Uri.parse( "geo:38.899533,-77.036476" );
  2. Intent it = new Intent(Intent.Action_VIEW,uri);
  3. </span>

调用拨号程序

  
  1. <span style="font-family:SimSun;font-size:14px;"> Uri uri = Uri.parse( "tel:xxxxxx" );
  2. Intent it = new Intent(Intent.Action_DIAL,uri);
  3. </span>

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

  
  1. <span style="font-family:SimSun;font-size:14px;"> <uses-permission
  2. android:name="android.permission.CALL_PHONE"/>
  3. </span>
使用Intent实现数据传递
在启动组件时,都需要通过Intent传递启动信息
Intent正是一个可以用来传递数据的媒介

   
  1. <span style="font-family:SimSun;font-size:14px;">Intent it = new Intent(this, SettingActivity.class);
  2. it.putExtra(“username”, “root”);
  3. startActivity(it);
  4. </span>

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

   
  1. <span style="font-family:SimSun;font-size:14px;">Intent it = getIntent();
  2. String username = it.getExtras().getString(“username”);
  3. </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>
  

启动者的回调接收示例

  
  1. <span style="font-family:SimSun;font-size:14px;">protected void onActivityResult(int requestCode,
  2. int resultCode, Intent data) {
  3. if(requestCode == REQUEST_CODE) {
  4. if(resultCode == RESULT_OK) {
  5. data.getExtras().getString(“someresult”);
  6. }
  7. }
  8. }
  9. </span>
接收数据返回
被启动者设置回调结果示例

  
  1. <span style="font-family:SimSun;font-size:14px;">Bundle bundle = new Bundle();
  2. bundle.putString(“someresult”, “somevalue”);
  3. bundle.putString(“otherresult”, “othervalue”);
  4. Intent it = new Intent();
  5. it.putExtra(bundle);
  6. setResult(RESULT_OK, it);
  7. finish();
  8. </span>

定制Intent和Intent-Filter


在需要启动另一个自定义项目中的Activity时

由于另一个项目的Activity不属于当前项目,不能得到Class

所以我们希望能够通过隐式Intent的方式启动

这时就需要对Action等属性进行自定义

并在Intent中使用这些自定义属性

Android中是允许Intent的自定义要求的

首先在AndroidManifest.xml中使用Intent-Filter自定义各种属性

然后在启动Activity时,在Intent中使用自定义属性




文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/52053356

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。