Android显式意图和隐式意图
intent基本理解
- 我们都知道Android四大组件:Activity 、Service、broadcast receiver 及 内容提供者。
- 其中,Activity 、Service、broadcast receiver 三大组件之间的通信 intent 起着至关重要的作用,即 媒介。
- intent 可以激活 Android 应用的三个核心组件:活动(Activity)、服务(Service)和广播接收器(BroadcastReceiver)
显式意图 和 隐式意图
显示意图:在创建 intent 的时候明确指定了组件名,例如:调用 Intent.setComponent() 或Intent.setClass() 或 使用构造器来指定组件( new Intent(MainActivity.this, OtherActivity.class))
隐式意图:在创建 intent 的时候没有明确指定组件名,而是 系统根据 设置的 动作(action)、类别(category)、数据(data: URI和数据类型)找到最合适的组件来处理这个意图。
隐式意图代码示例
第一步:创建 SecondActivity
package com.wust.intenttest;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;import androidx.annotation.Nullable;/*** ClassName: SecondActivity <br/>* Description: <br/>* date: 2021/10/24 22:49<br/>** @author yiqi<br />* @QQ 1820762465* @微信 yiqiideallife* @技术交流QQ群 928023749*/
public class SecondActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);textView.setText("我是secondView");setContentView(textView);}
}
第二步:在 清单文件 中声明
<activity android:name=".SecondActivity"><intent-filter><!-- 自定义的动作 一般前缀为包名--><action android:name="com.wust.intenttest.SECOND"/><!-- 附加信息 这个必须得加上--><category android:name="android.intent.category.DEFAULT"/></intent-filter>
</activity>
如果你在清单文件中 没有加 <category android:name="android.intent.category.DEFAULT"/> ,就会报如下错误,这是因为 你在调用 startActivity()的时候系统自动给你的意图添加了 android:name="android.intent.category.DEFAULT" 这个类别,所以你在清单文件中不声明,系统当然自动匹配不上,除非你不用隐式意图。
第三步:跳转代码
public void tz(View v) {//这里我们使用隐式意图 所以不指明是哪个组件Intent intent = new Intent();intent.setAction("com.wust.intenttest.SECOND");// 这个类别系统会自动添加intent.addCategory(Intent.CATEGORY_DEFAULT);startActivity(intent);
}
第四步:传递 Uri 数据
我们可以通过Intent的Data、Type、Extra传入一些数据,这些数据可以用于进一步筛选匹配Activity,打开指定的页面、文件,或者给准备启动的Activity传入需要的参数。
这个时候我们再新建一个 ThirdActivity.java
package com.wust.intenttest;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;import androidx.annotation.Nullable;/*** ClassName: ThirdActivity <br/>* Description: <br/>* date: 2021/10/25 9:57<br/>** @author yiqi<br />* @QQ 1820762465* @微信 yiqiideallife* @技术交流QQ群 928023749*/
public class ThirdActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);textView.setText("我是ThirdView");setContentView(textView);}
}
同时在 清单文件 中进行声明
<activity android:name=".SecondActivity"><intent-filter><!-- 自定义的动作 一般前缀为包名--><action android:name="com.wust.intenttest.SECOND" /><!-- 附加信息 这个必须得加上--><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity><activity android:name=".ThirdActivity"><intent-filter><!-- 自定义的动作 一般前缀为包名--><action android:name="com.wust.intenttest.SECOND" /><!-- 附加信息 这个必须得加上--><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>
我们可以发现 我们注册 SecondActivity 和 ThirdActivity 的时候 给的筛选条件 action 、category 是一样的。所以但我们仍然执行第三步的跳转代码时,系统就会让我们进行选择了,运行效果如下图:
这个时候,我们的 data 筛选条件就起作用了,我们不妨在 ThirdActivity 声明的时候加上如下筛选条件:
<activity android:name=".ThirdActivity"><intent-filter><!-- 自定义的动作 一般前缀为包名--><action android:name="com.wust.intenttest.SECOND" /><!-- 附加信息 这个必须得加上--><category android:name="android.intent.category.DEFAULT" /><!-- 自定义的scheme,还有别的属性,自行尝试 --><data android:scheme="http"/></intent-filter>
</activity>
这个时候,我们再 执行第三步的跳转代码 毫无疑问,当然是跳转到 SecondActivity。效果如下:
但是,这个效果并不是我要说的重点,我们重点是看如何通过 data 来传递 uri 数据。 所以,我们对 第三步 的跳转代码进行如下改造:
public void tz(View v) {// 这里我们使用隐式意图 所以不指明是哪个组件Intent intent = new Intent();intent.setAction("com.wust.intenttest.SECOND");// 这个类别系统会自动添加intent.addCategory(Intent.CATEGORY_DEFAULT);// 设置数据intent.setData(Uri.parse("http://121.0.0.1"));startActivity(intent);
}
相应的 ThirdActivity 也得作出相应的接收
package com.wust.intenttest;import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;import androidx.annotation.Nullable;/*** ClassName: ThirdActivity <br/>* Description: <br/>* date: 2021/10/25 9:57<br/>** @author yiqi<br />* @QQ 1820762465* @微信 yiqiideallife* @技术交流QQ群 928023749*/
public class ThirdActivity extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView textView = new TextView(this);textView.setText("我是ThirdView");setContentView(textView);Uri data = getIntent().getData();System.out.println( "data.getHost() => " + data.getHost());System.out.println( "data.getScheme() => " + data.getScheme());}
}
运行效果如下:
所有对于 data 这个筛选项 我们搞清楚以下三个地方:
清单文件中
<data android:scheme="http" android:host="127.0.0.1" android:port="80" android:path="/mypath" android:mimeType="wust/yiqi"/>
跳转代码
intent.setDataAndType(Uri.parse("http://127.0.0.1:80/mypath"), "wust/yiqi");
获取数据代码
data.getScheme()://data.getHost():data.getPort()data.getPath()
显式意图
如果大家把上面的 隐式意图 搞清楚,显式意图简直就是小草一碟。
根据 显式意图 的定义,我们在创建 intent 的时候,明确那个要跳转的组件即可。
第一步:代码示例
public void tz(View v) {// 这里我们使用显式意图 所以指明是哪个组件Intent intent = new Intent(this,SecondActivity.class);startActivity(intent);
}
第二步:传递 action 、category、data,请参考隐式意图
跳转代码
public void tz(View v) {// 这里我们使用显式意图 所以指明是哪个组件Intent intent = new Intent(this,SecondActivity.class);intent.setAction("com.wust.intenttest.SECOND");// 这个类别系统会自动添加intent.addCategory(Intent.CATEGORY_DEFAULT);// 设置数据intent.setDataAndType(Uri.parse("http://127.0.0.1:80/mypath"), "wust/yiqi");startActivity(intent);
}
数据获取代码 在目标组件中编写,这里的目标组件为 SecondActivity
Uri data = getIntent().getData();
System.out.println("data.getHost() => " + data.getPath());
System.out.println("data.getScheme() => " + data.getScheme());
效果展示
Android显式意图和隐式意图相关推荐
- 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...
本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...
- Android(Intent意图初解,显示意图,隐式意图,意图过滤器)
Android Intent 简介:Intent被称为意图,是安卓程序中的一种比较重要的组件间交户的方式,可以用于组件间的跳转,传递数据等.通常用作启动Activity,Service以及发送广播等. ...
- 安卓开发-Activity的显示意图和隐式意图+实例+Activity界面间数据的传递实例
<一:显示意图和隐式意图> 1.显示意图 //想打开的页面需要在创建意图时显式指定要打开那个Activity Intent intent = new Intent(this, 指定Acti ...
- 显式Intent 和隐式 Intent 的区别
显式 Intent : 在知道目标组件名称的前提下,去调用Intent.setComponent().Intent.setClassName()或Intent.setClass()方法或者在new I ...
- Andriod 显式启动、隐式启动练习简析
activity_main.xml代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...
- 33 个 JavaScript 核心概念系列(三): 显式 (名义) 与 隐式 (鸭子)类型转换
原文地址:落明的博客 一. 前言 说实话,JavaScript 的类型转换是个相当头疼的问题,无论是对于初学者还是有经验的老司机.它的难处并不在于概念多难理解,而是情况多且杂,看似相同的情况结果却又出 ...
- C#的显式接口和隐式接口
C#的显式接口和隐式接口 接口的实现分为:隐式实现和显式实现.如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现.显示实现是通过使用接口 ...
- JavaScript高级day02-AM【函数的prototype、显式原型与隐式原型、原型链】
笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目 录 P15 15.尚硅谷_JS高级_函数的prototype 15:04 1. 函数 ...
- 三种等待方式:强制等待、显式等待、隐式等待
我们在使用selenium的时候,会遇到一种定位不到的情况,因为web页面有一个加载的过程 当页面元素未出现时,去定位肯定是定位不到的,所以我们需要用到了'等待',该如何使用等待呢,让我们一起来探讨一 ...
最新文章
- centos7搭建需密码登入的简易ftp服务器
- Dynamips/Dynagen模拟CISCO路由环境
- 【收藏】138条 Vim 命令、操作、快捷键全
- 如何更改Joomla中的默认语言
- Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...
- session的工作原理【转】
- vim插件ctags的安装和使用
- 王道考研数据结构笔记
- 2017年数模国赛B题第一小题的思路过程(个人思路)
- html表格固定右侧列,jQuery锁定表头和固定列插件FixedTable
- 无源晶振负载电容值CL匹配方法及说明
- iOS自动化测试之ipa安装失败的日志分析
- 如果宇宙是答案,那么问题是什么?
- outlook服务器邮件满了怎么办,outlook邮箱满了怎么清理_outlook一直提示邮箱满了如何清理-win7之家...
- 大学计算机考试59分,大学期末考59分,你会找老师理论吗?很多人都猜错
- CTF题库实验吧 py的交易
- 常见的数据结构和数据库的设计方法
- 移动硬盘分区后数据还能恢复吗?
- python语言的特点-Python语言的特点有哪些?
- oracle19数据库对内存要求,在天堂 - 技术老男