简介
何为 Intent?
Intent 被翻译为中文就是“意图,目的”的意思。意图(目的)那好理解啊,我们做事情不都是带着一定的 Intent 才去做的吗?那么在 Android 中的 Intent 中是否跟我们在现实世界中的相同呢?其实在 Android 中它只是一个消息传递对象,说的实在点它就是个跑腿送信的家伙。那么它又是在替那些 dalao 而工作呢?如果你觉得很好奇,那么骚年请跟着我的节奏(一起摇摆)继续往下看。
基本概念
基本用例
接下来,我们就来看看那些年 Intent 为之服务的大佬们都是些谁?其实我说出来,你可能就觉得一点都不陌生了。
它们分别是 Activity、服务、广播。
- 启动 Activity:
当我们需要从 Activity A 跳转至我们的 Activity B 时,通过将 Intent 对象传递给 startActivity(),就可以启动目标Activity了。我相信骚年你也发现了既然 Intent 工作主要是跑腿和送信,那么现在跑腿的任务完成了那么送信呢?别急!这在下面的用法时我会向你介绍。
Intent 启动 Activity 过程图
启动服务:
有时候你可能需要一些在后台进行的操作(比如,下载文件),这时你就可以通过将 Intent 对象传递给 startService() 启动你想要的服务来完成这些操作。传递广播:
首先 Android 中的广播是一个所有应用程序都可以接受的消息。Android 系统将根据系统发生的各种事件(比如开关机、电量变化以及网络变化等),传递各种广播。通过将 Intent 传递给 sendBroadcast() 来发送你自定义的广播。
两种类型
Intent 这个跑腿送信的工作还分为两个工种呢。骚年你可能会问我,为什么 Intent 还要分类呢?预知答案如何,且看下面解答。
显式 Intent:
显式 Intent 之所以叫“显式”,就是因为它太实在“意图”了,骚年你没觉得吗?你要启动的 Activity 的都在它的构造方式中声明了,你说说这是不是很“意图”?那它这样就会不会导致什么问题呢?我的回答是Yes,比如说用户想要打开相机时,我们并不知道用户想要调用的原生相机应用,还是其他的美颜相机类应用。隐式 Intent:
之所以叫做“隐式” Intent,其实是因为我们不需要去关心用户他调用那个应用来完成操作。而且就算我们指定了一个应用,但是用户并没有安装怎么办?所以这时候使用隐式 Intent 更为安全,也更为合理。
Intent 过滤器
那 Intent 过滤器是什么呢?它是 AndroidManifest.xml 文件中的一个表达式,它指定了这个组件能接收的 Intent 类型。看不懂(一脸懵)?没事儿,我学的时候也没看懂(微笑脸)。这么跟你举例说明吧,比如说在我们的应用中有个具有分享功能的 Activity ,它不仅能分享文本还能分享音视频。我们就可以为它添加一个 Intent 过滤器,使它能够响应分享文本或者视频的 Intent 类型。这样一来,我们就不用关心用户到底是要分享文本还是音视频了。
通用 Intent
上面我们说了隐式 Intent 并不指定要启动的具体应用,它仅仅是指定一项操作并提供执行该操作所需的数据。然后 Google 老大就帮我们开发者们提供了一些常用的应用组件的 Intent 启动方式以及 Intent 过滤器的写法。这在下面的参考资料中我会贴上链接。
基本用法
创建 Intent
显式 Intent
显示 Intent 的创建过程比较简单,因为我们都知道要启动的 Activity、服务、广播。这里我只是简单的介绍,就只用 Activity 来举例,下面隐式 Intent 和Intent 过滤器的创建也是一样,所以我就不再赘述了。
Intent intent = new Intent(MainActivity.this,TargetActivity.class);
intent.setData(Uri.parse("https://developers.google.com/?hl=zh-cn"));
startActivity(intent);
这里我启动了一个叫 TargetActivity 的 Activity,并且向它传递了 Google 开发者中文官网的网址。
隐式 Intent
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, textMessage);
intent.setType("text/plain");
// 检查设备是否可以处理此请求
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
这里我通过将 action 指定为 ACTION_SEND 表示启动能发送信息的应用,并且通过 putExtra() 来传递数据。
创建 Intent 过滤器
<activity android:name=".TargetActivity">
<intent-filter>
<action android:name="com.z4knight.intenttest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
在这里需要注意下,只有 <action> 和 <category> 的内容都能匹配的 Intent 才能响应。不过这里 <category> 是默认的一种写法,这样在 Intent 调用 startActivity() 方法的时候会自动将这个 category 添加到 Intent 中。
Intent intent = new Intent("com.z4knight.intenttest.ACTION_START");
intent.setData(Uri.parse("https://developers.google.com/?hl=zh-cn"));
startActivity(intent);
这样达到启动 TargetActivity 的作用,但是却没有在 Intent 构造函数中直接指定 Activity。
参考资料
官方介绍并且是中文的,建议认真看看,肯定能大涨你的内力。
Android开发者官网之 Intent 和 Intent
过滤器
国人写的关于 Intent 的博客,很详细而且条理清晰。
最后
希望这篇 Intent 入门文章能对你有所帮助,也十分感谢你阅读我的文章。
更多 Android 开发相关文章请点击 我的主页 查看。