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

本章内容

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中使用自定义属性

时间: 2024-08-06 10:02:14

AndroidUI高级之十六使用Intent进行通信的相关文章

Unix环境高级编程(十六)进程间通信

进程间通信(IPC)是指能在两个进程间进行数据交换的机制.现代OS都对进程有保护机制,因此两个进程不能直接交换数据,必须通过一定机制来完成. IPC的机制的作用: (1)一个软件也能更容易跟第三方软件或内核进行配合的集成,或移植.如管道,在shell 下执行 ps –aux | grep bash. (2)简化软件结构, 可以把一个软件划分多个进程或线程,通过IPC,集成在一起工作.如消息队列. (3)让操作系统各个模块交换数据,包括内核与应用程序机制. (4)提供进程之间或同一进程之间多线程的

Python之路【第十六篇】:Django【基础篇】

Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver

Qt浅谈之十六:TCP和UDP(之一)

一.简介 Qt使用QtNetwork模块来进行网络编程,提供了一层统一的套接字抽象用于编写不同层次的网络程序,避免了应用套接字进行网络编的繁琐(因有时需引用底层操作系统的相关数据结构).有较底层次的类如QTcpSocket.QTcpServer和QUdpSocket等来表示低层的网络概念:还有高层次的类如QNetworkRequest.QNetworkReply和QNetworkAccessManager使用相同的协议来执行网络操作:也提供了QNetworkConfiguration.QNetw

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制 在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需要提供AccessToken,因此我们每次在调用高级接口之前,都需要执行一次获取AccessToken的方法,例如: 1 var accessToken = AccessTokenContainer.

《Java并发编程实战》第十六章 Java内存模型 读书笔记

Java内存模型是保障多线程安全的根基,这里仅仅是认识型的理解总结并未深入研究. 一.什么是内存模型,为什么需要它 Java内存模型(Java Memory Model)并发相关的安全发布,同步策略的规范.一致性等都来自于JMM. 1 平台的内存模型 在架构定义的内存模型中将告诉应用程序可以从内存系统中获得怎样的保证,此外还定义了一些特殊的指令(称为内存栅栏或栅栏),当需要共享数据时,这些指令就能实现额外的存储协调保证. JVM通过在适当的位置上插入内存栅栏来屏蔽在JVM与底层平台内存模型之间的

第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

第三百八十六节,Django+Xadmin打造上线标准的在线教育平台-HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页面返回给浏览器 一般母板里都是写的一个网页里不变的地方,也就是通用的地方,被继承页(访问页)都是每个页面不同的地方,也就是将页面不同的地方引入到母板组合成一个新页面返回浏览器 母板里一般都是网页的.头部.底部.头部底部css.头部底部js 被继承页(访问页)里一般都是新内容,新内容的css和js 母

第十六篇 人类世界

第十六篇  人类世界 人类世界是一个快速发展的世界.在这个宇宙中人类物种出现的时间并不算很长,随着大宇宙的发展,在宇宙经历了多次调整①之后,人类物种是在宇宙发展需要的情况下才被创造的,可以说我们人类物种算是出现在一个非常好的时间点上. 也就是说,人类物种在被创造之前已经有很多高智慧物种为人类打下了良好的基础,这些基础能够让人类这个物种在宇宙中得到快速的发展.如果没有这样的基础,人类世界也不会发展得如此庞大. 人类带着创造者的期待与信任出现在这个宇宙中,开始了人类生命的历程.由于人类这个物种肩负着

QT开发(三十六)——Model/View框架

QT开发(三十六)--Model/View框架 一.Model/View框架简介 1.Model/View框架核心思想 Model/View框架的核心思想是模型(数据)与视图(显示)相分离,模型对外提供标准接口存取数据,不关心数据如何显示,视图自定义数据的显示方式,不关心数据如何组织存储. Model/View框架中数据与显示的分离,可以允许使用不同界面显示同一数据,也能够在不改变数据的情况下添加新的显示界面.为了处理用户输入,引入了委托(delegate).引入委托的好处是可以自定义数据项的渲

JavaScript学习总结(十六)——Javascript闭包(Closure)

原文地址: http://www.cnblogs.com/xdp-gacl/p/3703876.html 闭包(closure)是Javascript语言的一个难点,也是它的特色, 很多高级应用都要依靠闭包实现.很早就接触过闭包这个概念了,但是一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什么,有什么用,今天 在网上看到了一篇讲JavaScript闭包的文章(原文链接), 讲得非常好,这下算是彻底明白了JavaScript的闭包到底是个神马东东以及闭包的用途了,在此写出来和大家分