Intent介绍及Intent在Activity中的使用方法
1.Intent的实现过程
在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部的Activity/Service之间的交互。
Intent负责对应用中一次操作进行描述,描述内容包括动作以及动作所涉及的数据,Android中的Intent机制则根据此描述,找到对应的组件,将Intent传递给该被调用组件,完成对组件的一次调用。
这便是Intent的实现过程,可见,在Intent中提供了组件互相调用的相关信息,实现了调用者与被调用者之间的解耦。
2.Intent的应用场合
归纳起来,Intent的应用场合主要有以下三种:
2.1启动一个Activity
(1)Activity.startActivity(Intent intent); //启动一个Activity
(2)Activity.startActivityForResult(Intent intent, int requestCode); //启动一个带请求码的Activity,当该Activity结束时将回调原Activity的onActivityResult()方法,并返回一个结果码。
2.2启动一个Service
(1)Context.startService(Intent service);
(2)Context.bindService(Intent service, ServiceConnection conn, int flags);
2.3启动一个Broadcast
(1)sendBroadcast(Intent intent);
sendBroadcastAsUser(Intent intent, UserHandle user);
(2)sendStickyBroadcast(Intent intent);
sendStickyBroadcastAsUser(Intent intent, UserHandle user);
(3)sendOrderedBroadcast(Intent intent, String receiverPermission);
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
BroadcastReceiver resultReceiver,Handler scheduler, int initialCode, String initialData, Bundle initialExtras);
3.Intent属性设置
Intent的属性设置包括:Action(要执行的动作)、Data(执行动作所操作的数据)、Type(显式的指定Intent的数据类型)、Category(执行动作的附加信息)、Component(指定Intent目标组件的类名称)、Extras(其它所有附加信息的集合)。
3.1 Action(要执行的动作)
在SDK中定义了一系列标准动作,其中的一部分如图1所示。
图1 部分标准动作
其中,ACTION_CALL表示调用拨打电话的应用;ACTION_EDIT表示调用编辑器;ACTION_SYNC表示同步数据。
3.2 Data(执行动作所操作的数据)
在Intent中,Data使用指向数据的URI来表示。比如,在联系人应用中,指向联系人列表的URI是content://contacts/people/。
3.3 Type(显式的指定Intent的数据类型)
对于不同的动作,其URI数据的类型是不同的。
通常,Intent的数据类型能够根据其数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型。
3.4 Category(执行动作的附加信息)
Category表示执行动作的附加信息。比如,当我们想要让所执行的动作被接收后,作为顶级应用而位于其他所有应用的最上层,并可以使用附加信息LAUNCHER_CATEGORY来实现。
3.5 Component(指定Intent目标组件的类名称)
Component用于指定Intent目标组件的类名称。通常,Android会根据Intent 中所包含的其它属性信息(比如Action、Data/Type、Category)进行查找,并找到一个与之匹配的目标组件。但是,如果我们设置了Component属性,明确的指定了Intent目标组件的类名称,那么上述查找过程将不需要执行。
3.6 Extras(其它所有附加信息的集合)
使用extras可以为组件提供扩展信息。
4.Intent解析过程
在使用Intent时,根据是否明确的指定Intent对象的接收者,而分为两种情况。一种是显式的Intent,即在构造Intent对象时就指定其接收者;另一种是隐式的Intent,即在构造Intent对象时,并不指定其接收者。
对于显式的Intent来说,Android不需要解析Intent,因为目标组件已经很明确。对于隐式的Intent来说,Android需要对其进行解析,通过解析,将Intent映射给可以处理该Intent的Activity、Service或Broadcast。
Intent解析机制是通过查找注册在AndroidManifest.xml文件中的所有IntentFilter,以及IntentFilter所定义的Intent,找到最匹配的Intent。
在解析过程中,Android通过判断Intent的Action、Type、Category这三个属性,从而找出最匹配的Intent,具体的判断方法如下:
(1)如果Intent指明了Action,则目标组件IntentFilter的Action列表中就必须包含有这个Action,否则不能匹配;
(2)如果Intent没有提供Type,系统将从Data中得到数据类型。目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
(3)如果Intent中的数据不是content: URI,而且Intent也没有明确指定它的Type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同理,Intent 的scheme必须出现在目标组件的scheme列表中,否则不能匹配。
(4)如果Intent指定了一个或多个Category,这些类别必须全部出现在目标组件的类别列表中,否则不能匹配。
5.Intent使用实例
下面介绍几个使用Intent的实例。
5.1调用其他的应用
通过Intent可以调用并启动别的应用程序,比如调用拨打电话的程序,便可以使用如下的方法来完成:
- /*
- * Function : 调用拨打电话的程序
- * Author : 博客园-依旧淡然
- */
- public void intentDemo_Call() {
- Intent intent_call = new Intent(); //创建一个意图
- intent_call.setAction(Intent.ACTION_CALL); //设置意图为打电话
- intent_call.setData(Uri.parse("tel:110")); //设置电话号码
- startActivity(intent_call); //启动意图
- }
复制代码
当然了,因为这里使用到了打电话的功能,我们还需要在AndroidManifest.xml文件中,添加申请打电话的资源权限,具体实现方法如下:
- <!-- 打电话的权限 -->
- 2 <uses-permission
- android:name="android.permission.CALL_PHONE" />
复制代码
有关Android中的权限请求可以参阅《 Android数据手册02:android.permission权限请求汇总 》。
5.2跳转到另一个Activity
通过使用Intent不仅可以调用别的应用程序,还可以实现应用程序内部之间Activity的跳转。比如如下的代码便实现了从MainActivity跳转到SecondaryActivity,并向SecondaryActivity中传递了两个数据name和age。
- /*
- * Function : 跳转到SecondaryActivity
- * Author : 博客园-依旧淡然
- */
- public void intentDemo_GoToSecondaryActivity() {
- Intent intent_toSecondary = new Intent(); //创建一个意图
- intent_toSecondary.setClass(this, SecondaryActivity.class); //指定跳转到SecondaryActivity
- intent_toSecondary.putExtra("name", "jack"); //设置传递内容name
- intent_toSecondary.putExtra("age", 23); //设置传递内容age
- startActivity(intent_toSecondary); //启动意图
- }
复制代码
那么,如何在SecondaryActivity中接收从MainActivity中传过来的内容(name、age)呢?下面的代码给出了一种实现方案。
- /*
- * Function : 接收mainActivity中的intent_toSecondary
- * Author : 博客园-依旧淡然
- */
- public void acceptIntent() {
- Intent intent_accept = getIntent(); //创建一个接收意图
- Bundle bundle = intent_accept.getExtras(); //创建Bundle对象,用于接收Intent数据
- String name = bundle.getString("name"); //获取Intent的内容name
- int age = bundle.getInt("age"); //获取Intent的内容age
- }
复制代码
5.3发送一个带回调方法的意图
有时,我们可能需要通过定义在MainActivity中的某一控件来启动SecondaryActivity,并且当SecondaryActivity结束时,返给MainActivity一个执行结果。
要实现上述的功能,只需要完成以下三步骤即可。
(1)在MainActivity中实现向SecondaryActivity发送带请求码的意图,具体实现方法如下:
- /*
- * Function : 向SecondaryActivity发送带请求码的意图
- * Author : 博客园-依旧淡然
- */
- public void intentDemo_request() {
- Intent intent_request = new Intent(); //创建一个意图
- intent_request.setClass(this, SecondaryActivity.class); //指定跳转到SecondaryActivity
- startActivityForResult(intent_request, REQUEST_CODE); //启动带请求码意图
- }
复制代码
(2)在SecondaryActivity中接收intent_request,并向意图中填充要返给MainActivity的内容,最后还需要设置一个返回码。具体的实现方法如下:
- /*
- * Function : 接收mainActivity中的intent_request并返回一个结果码
- * Author : 博客园-依旧淡然
- */
- public void acceptIntentAndReturn() {
- Intent intent = getIntent(); //创建一个接收意图
- intent.putExtra("back", "data of SecondaryActivity"); //设置意图的内容
- setResult(RESULT_CODE, intent); //设置结果码
- finish(); //结束SecondaryActivity,并返回MainActivity
- }
复制代码
3)当结束SecondaryActivity时,程序将返回到MainActivity界面。此时,MainActivity中的onActivityResult()方法将被回调,而我们要做的就是实现该方法。在本示例中,该方法的具体实现方法如下:
- /*
- * Function : onActivityResult回调方法
- * Author : 博客园-依旧淡然
- */
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if(requestCode == REQUEST_CODE && resultCode == SecondaryActivity.RESULT_CODE) {
- Bundle bundle = data.getExtras();
- String str = bundle.getString("back");
- Toast.makeText(this, "从SecondaryActivity的返回值为:" + str, Toast.LENGTH_LONG).show();
- }
- }
复制代码
以上的代码,我们通过判断requestCode和resultCode便可以唯一的确定MainActivity中的调用者和SecondaryActivity中的被调用者,建立起了一一对应的关系。并且,我们通过Bundle对象获取了从SecondaryActivity中返回给MainActivity的内容,并通过Toast进行了输出,如图2所示。
图2 从SecondaryActivity中返回的内容
由图2可见,从SecondaryActivity中返回的内容正是我们在SecondaryActivity中定义的字符串“data of SecondaryActivity”。
6.总结
本篇博文主要介绍了Intent的相关概念,以及Intent在Activity中的三种使用方法。有关Intent在Service和Broadcast中的使用方法,将在后续的Service和Broadcast的学习过程中再做介绍。
原文链接:http://www.cnblogs.com/menlsh/archive/2013/03/30/2991111.html
Intent介绍及Intent在Activity中的使用方法相关推荐
- 【Android】Intent介绍及Intent在Activity中的使用方法
本篇博文主要介绍Intent的相关概念,以及Intent在Activity中的使用方法. 1.Intent的实现过程 在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部 ...
- 解析Activity中的onCreate方法
我们在写一个自己的Activity的时候需要注意: 1.都必须extends Activity(或者其子类): 2.必须在方法onCreate中存在一条这样的语句:super.onCreate(也就是 ...
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...
- Android 中activity中传递数据的方式
方式一 通过Intent进行数据传递(日后更新) 方式二 通过剪切板进行数据的传递 首先在第一个Activity中,设置所要进行传递的数据 /*** 通过剪贴板传递字符串数据的操作**/private ...
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
转载:http://blog.csdn.net/xiabing082/article/details/48781489 1. 大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...
- activity中fragment 返回键不退出_分享一波阿里Android客户端面经,我竟连这都答不上来?...
今天整理了电脑,发现了几个月前总结了一半的阿里面经,想起来了去年秋招不愉快的阿里一面,今天分享给大家.希望大家前事不忘后事之师,吸取经验教训. 一面(挂) 1.点击图标,应用打开,点击home键,重新 ...
- PHP删除数组中空值的方法介绍
这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...
- Android的onDestroy方法,Android编程之Activity中onDestroy()调用分析
本文分析了Android编程之Activity中onDestroy()调用方法.分享给大家供大家参考,具体如下: 刚刚一个BUG让我发现,如果 activity 实现了一个回调接口,然后使用 this ...
- android oncreate调用,Android app启动activity并调用onCreate()方法时都默默地干了什么?...
在AndroidManifest.xml文件中的元素中有这么两句: 当写好的应用发布到手机上之后,当双击"APP"应用的图标时,系统会将这个点击时间包装成一个Intent,该Int ...
最新文章
- 合并道路_资质改革已经确定!盘点被合并的资质!有这资质的要注意了
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
- 田志刚:写文章的两个好处
- 【Vue】组件复用导致的路由切换时页面不刷新问题
- CSDN:解决粉丝网友集中问题留言处,把你所有的问题在留言处留言,我会一一回答
- *(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
- Google 发布开源库 TFQ,快速建立量子机器学习模型!
- Coreseek安装测试配置指南(转)
- linux系统中各颜色的代表
- grpc系列1-K8S集群,VIP,grpc._channel._InactiveRpcError connection reset by peer解决方案 Paddleserving服务化部署
- 测试工程师如何提高工作效率
- fm24c16c语言程序,铁电存储器FM24C16的页面写和任意字节读汇编程序
- 20-40K/月,百度车联网招聘多岗位Android工程师(地点:深圳)
- 你在用哪种编程字体?
- CentOS7安装onlyoffice实现word的在线预览和编辑
- HTML、CSS学习笔记3(平面转换:位移、旋转、缩放,渐变)
- 【RC延迟电路 RC充电电路】 multisim 14.0仿真 参数计算
- nonebot,cqhttp 机器人学习1
- oracle计算6的阶乘,oracle 求阶乘
- 亚马逊云科技的Graviton3为什么只有64核,官方回应来了!
热门文章
- [MS Sql Server术语解释]预读,逻辑读,物理读
- django+nginx+uwsgi部署web站点
- 碰到日期题就怕的我来写一道水题吧
- 从零开始学Axure原型设计(高级篇)
- Scala.js:将Scala编译为JavaScript的编译器
- python面试题总结(1)--语言特性
- linux我如何查看一个脚本的路径,linux获取shell脚本所在绝对路径操作介绍
- mysql pow函数怎么用_pow函数怎么用
- 一致性hash算法_(图文案例)一致性哈希算法详解 一点课堂(多岸教育)
- linux运维适合女生么,女生真的不适合做IT行业吗?Linux运维适合女生学习吗?