本章内容

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;">//发送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

AndroidUI高级之十六使用Intent进行通信相关推荐

  1. 【正点原子MP157连载】 第十六章 UART串口通信实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  2. 谷粒商城 高级篇 (十六) --------- 社交登录

    目录 前言 一.OAuth 2.0 二.微博登陆准备工作 三.整合微博登录 1.引导用户到如下地址 2. 授权登录后进入回调函数 3. Session共享问题解决 ① session复制 ② 客户端存 ...

  3. 实验十六VLAN,VLANIF通信

    1.通过VLAN,VlANif实现全部的PC互通 2.将二层交换机连接PC的接口设为access,连接核心交换机的的接口设为trunk,核心交换机的接口也设为trunk并且允许所有vlan通过,这样V ...

  4. 软考高级系统架构设计师系列论文三十六:论基于构件的软件开发

    软考高级系统架构设计师系列论文三十六:论基于构件的软件开发 一.摘要 二.正文 三.总结 一.摘要 本文以我主持的某商业银行交易监控分析系统项目为实例,探讨了作为开发方公司基于构件技术开发项目碰到的问 ...

  5. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  6. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

  7. 第十六届全国大学生智能车竞赛技术报告 | 单车拉力组- 上海海事大学-骑摩托的蒙娜丽莎

    简 介: 本文设计的智能车系统以 STC16F40K128微控制器为核心控制单元,通过车体前方的电感检测赛道电磁信息,通过编码器检测智能车的实时速度,利用陀螺仪检测小车姿态,使用PID 控制算法调节电 ...

  8. 第十六届全国大学智能车全国总决赛竞赛闭幕式

    正式文档将会在竞赛网站公布: smartcar.cdstm.cn §01 组委会扩大会议 第十六届全国大学生智能车智能车竞赛组委会将在8月24日晚上8:00召开第四次扩大会议,这也是本次比赛的最后一次 ...

  9. 第十六届全国大学生智能汽车竞赛安徽赛区赛事指南

    主办单位:安徽省教育厅 中国自动化学会 承办单位:安徽中医药大学 合肥工业大学 中国 合肥 2021年7月 §01 赛事简介   全国大学生智能汽车竞赛起源于韩国,是韩国汉阳大学汽车控制实验室在飞思卡 ...

最新文章

  1. 第一个使用计算机图形学术语,计算机图形学考题
  2. Ueditor配置及在项目中的使用
  3. HTML DOM Event 对象
  4. Sprint会议记录(第五组)
  5. mysql 5.7 备份innodb_mysql5.7 innodb数据库备份工具Xtrabackup的安装
  6. substring not found什么意思_英文写作中,除了not,你还会其他否定表达吗?
  7. 只进ResultSet 不支持请求的操作
  8. 程序的装入和链接过程
  9. 螺旋矩阵c++语言_一起刷 leetcode 之螺旋矩阵(头条和美团真题)
  10. postman压力测试_如何用Postman简单做接口自动化
  11. 完全掌握AS中点(.)语法的应用
  12. php curl模拟post请求提交数据
  13. xp也可以将U盘格为NTFS
  14. java三大特性之—封装
  15. 爬取CSDN博客文章,统计文章历史数据
  16. 商务办公软件应用与实践【8】
  17. 百度脑图打开本地xmind文件的方式
  18. 基于JAVAWeb美食网站设计计算机毕业设计源码+数据库+lw文档+系统+部署
  19. Verilog专题(二十五)Lemmings4
  20. 纸上得来终觉浅,决知此事要躬行

热门文章

  1. ReactJS实用技巧(1):JSX与HTML的那些不同
  2. BZOJ 1019: [SHOI2008]汉诺塔( dp )
  3. android权限检查
  4. hdu 1171 dp(多重背包)
  5. LeetCode(883)——三维形体投影面积(JavaScript)
  6. java web空指针,java - Web服务中的Java空指针异常@autowired [重复] - 堆栈内存溢出
  7. 很想去摆地摊,可是不知道怎么开始,前期需要做什么准备工作吗?
  8. htaccess文件是什么
  9. 楼对面的男士夏天就光膀子,请问大家,男士真的都爱光膀子吗?
  10. 荣耀v20、荣耀20Pro、mate20、Nova5Pro选哪个?