1. 什么是隐式Intent?
Intent是Android中比较重要的组件,常用来启动一个新的Activity或者Service、广播某个事件,以及在Android组件之间传递数据。通过Intent来启动新的Activity或者Service通常有两种方法,一种是显示启动,另一种是隐式启动。
显示启动就是在明确指出要启动的Activity或者Service的类或者包名。例如:

Intent intent = new Intent(this, PlayerActivity.class);
startActivity(intent);
Intent intent =new Intent();
intent.setClass(this,PlayerActivity.class);
startActivity(intent);
Intent intent =new Intent();
intent.setClassName(“com.jhuster.videoplayer”,“com.jhuster.videoplayer.PlayerActivity”);
startActivity(intent);

隐式启动则是不明确指定启动哪个Activity或者Service,而是通过设置Action、Data、Category,让系统来筛选出合适的目标。
例如拨打电话:

Intent intent =new Intent(Intent.ACTION_DIAL,Uri.parse(“tel:021-80961111”));
startActivity(intent);

系统接收到隐式启动请求后,会根据系统中各个Activity在AndroidManifest.xml文件中声明的<intent-filter>来比较和判断是否匹配当前的Intent请求的。
因此,如果我们希望PlayerActivity能够被系统隐式启动,则首先需要在AndroidManifest.xml文件中为该Activity添加<intent-filter>.
2. 为PlayerActivity添加<intent-filter>
<intent-filter>的标签有很多,这里只介绍和添加最基本且最常用的三个标签,分别是<action>,<category>和<data>。
2.1 添加<action>
这个标签是必须添加的,可以自己定义,也可以使用系统预定义的变量,Android系统默认定义了很多action,具体可以查看SDK文档,或者Google一下“android.intent.action.”。
这里,因为我们的类是用来“播放视频”的,因此可以使用系统预定义的:android.intent.action.VIEW,它表示需要启动某个Activity显示指定的数据(包括图片、视频、文档等)。
添加了后的如下所示:

<activity android:name="com.jhuster.videoplayer.PlayerActivity"><intent-filter><action android:name="android.intent.action.VIEW"/></intent-filter>
</activity>

2.2 添加<category>
category代表类别,定义了Activity的类别,Activity可以设置一个或者多个category标签。常用的一般有3个:DEFAULT,HOME,LAUNCHER

DEFAULT  默认动作
HOME     设置为本地桌面应用
LAUNCHER 本APP的启动Activity

本应用中我们使用DEFAULT类别即可,DEFAULT也是category最常用的选项。
添加了category后的如下所示:

<activity android:name="com.jhuster.videoplayer.PlayerActivity"><intent-filter><action android:name="android.intent.action.VIEW"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter>
</activity>

2.3 添加<data>
data 代表数据源,是<intent-filter>中最复杂的标签,因为不同的Activity支持的数据来源和类型多种多样,所以需要通过详细的data标签信息来指明。

data 标签有很多属性,包括:
android:host: 指定主机名,例如:google.com
android:port:  制定主机端口,例如: 80
android:path:  指定URL的有效路径值,例如: /index/examples
android:mimeType: 指定组件可以执行的数据类型,例如:image/jpeg,video/*
android:scheme: 指定特定的模式,例如:content,http

这里,假设我们的视频播放器支持多种数据来源,包括:本地视频文件,本地媒体URL,网络视频流(HTTP、RTMP、RTSP协议),另外,假设我们的视频播放器只支持mp4和3gpp两种文件格式。
那么,下面我们来添加两种最常用<data>的标签,scheme和mimeType,并且解释每条标签对应的是怎样的一种数据来源或者数据格式。
(1)<data android:scheme="xxx"/>
这里的xxx可以是:file,content,网络协议(HTTP,RTMP、RTSP等)
本应用中我们给PlayerActivity的中<Intent-filter>添加:

<data android:scheme="file"/>
<data android:scheme="content"/>
<data android:scheme="http"/>
<data android:scheme="rtsp"/>

添加了这样几条data标签项之后,如果隐式Intent中的数据来源URL是以“file://”、“content://”、“http://”、“rtsp://”开头的URL资源,都会隐式地启动我们的PlayerActivity。
例如,其他的Activity可以通过下面的方法来隐式启动我们的PlayerActivity.

Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.fromFile(new File("/sdcard/test.3gp")));
startActivity(intent);

Uri.fromFile这条语句会把指定的文件位置转换为以“file://”开头的Uri对象,如上述例子最终得到的URL为:“file:///sdcard/test.3gp”
同理,可以通过Uri.parse来转换我们常见的网络地址字符串为Uri对象,例如:

Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://ticktick.blog.51cto.com/test.mp4"));
startActivity(intent);

(2)<data android:mimeType="xxx"/>
mimeType用来设置数据类型,例如图像数据(image/png或者image/),视频数据(video/mp4或者video/),如果使用*代表匹配所有的子类型。
MIME TYPE是互联网的一种标记数据类型的标准,现在已经支持非常多的类型了,这里我不一一列举,大家可以在Google上搜索一下。
本应用中我们假设需要支持的是mp4和3gpp两种类型,那么,我们可以添加这样两条 mimeType :

<data android:mimeType="video/3gpp"/>
<data android:mimeType="video/mp4"/>

那么,其他的Activity就可以通过下面的方法来隐式启动我们的PlayerActivity. 注意,当<intent-filter>已经添加了mimeType之后,隐式Intent必须设置Type参数才能匹配到该Activity,所以建议使用setDataAndType方法,而不是单一的setData方法。

Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.3gp")),"video/3gpp");
startActivity(intent);

当然,这里的"video/3gpp"也可以写成:"video/*",但这样可能会匹配到一些不支持3gpp的播放器。

(3) 小结
添加了<data>标签后的如下所示:

<activity android:name="com.jhuster.videoplayer.PlayerActivity"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data android:scheme="file"/><data android:scheme="content"/><data android:scheme="http"/><data android:scheme="rtsp"/><data android:scheme="rtmp"/><data android:mimeType="video/3gpp"/><data android:mimeType="video/mp4"/></intent-filter>
</activity>

3. 在PlayerActivity中获取参数
通过上面的介绍,我们已经知道了怎样添加<intent-filter>以及怎样通过隐式Intent来调用我们的PlayerActivity,那么,下面我们还要了解如何在PlayerActivity中解析来自隐式Intent的参数。
其实,Intent提供了很多方法可以Get相关的参数信息,例如:

public String getAction();
public Uri    getData();
public String getScheme();
public String getType();

上述方法分别可以获取Intent的Action,Data Uri,Scheme和MimeType值。
对于“file://”开头的Uri对象,我们可以通过Uri.getPath方法得到去除了“file://”前缀的具体文件地址。例如: “file:///sdcard/test.mp4”则可以转换为实际的“/sdcard/test.mp4”。
对于网络码流,例如:“http://”、“rtsp://”等开头的Uri,则可以直接通过toString()方法转换为实际地址的字符串。
而对于“content://”开头的URI对象,一般是从系统的媒体数据库中检索出来的结果,因此需要反向查找得到实际的文件地址,这里提供一个函数进行转换。

public static String getVideoPath(Context context, Uri uri) {Uri videopathURI = uri;if(uri.getScheme().toString().compareTo("content") ==0) {Cursor cursor = context.getContentResolver().query(uri,null,null,null,null);if(cursor.moveToFirst()) {intcolumn_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);videopathURI = Uri.parse(cursor.getString(column_index));return videopathURI.getPath();}}else if(uri.getScheme().compareTo("file") ==0) {return videopathURI.getPath();}return videopathURI.toString();
}

Android Intent隐式启动通过scheme打开应用相关推荐

  1. android intent隐式启动一个隐藏图标的APP

    intent隐式启动被隐藏图标的activity的方法 今天开发安卓的时候遇到了一个问题,被隐藏掉图标的apk程序,用另一个apk隐式启动的时候,报错. 网上百度了一圈,都说加上category.DE ...

  2. Android隐式启动匹配:action,category,data

    简介 Android开发中,Activity,Service 和 BroadcastReceiver 启动有两种方式,显示启动和隐式启动. 为方便下面描述,我以Activity启动为例. 显示启动便是 ...

  3. Andriod 显式启动、隐式启动练习简析

    activity_main.xml代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayou ...

  4. 隐式启动Activity以及Intent.resolveActivity的使用

    打开Activity的方式 打开Activity可以分为显式和隐式两种,显式调用需要明确地指定被启动对象的组件信息,比如包名和类名. 隐式调用的规则 1.隐式调用的核心:Intent可以匹配目标组件的 ...

  5. Android App 隐藏图标(Android 10除外)并隐式启动

    正好有个小需求,要把Android的App图标隐藏掉(Android 10除外,下面简单说明一下),并提供隐式启动. 实现这个功能非常简单,直接上代码. AndroidManifest.xml文件: ...

  6. Android的隐式意图

    Android的隐式意图 对于隐式意图,Android是怎样寻找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用 ...

  7. Service的两种启动方式,显示启动和隐式启动

    1.显式启动 Service端: 需要声明android:exported="true",这样别的APP才能访问. <service android:name=" ...

  8. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  9. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...

    本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...

最新文章

  1. CoreNLP请求超时 runtime out
  2. iOS五种本地缓存数据方式
  3. javaIo流实际应用
  4. django与easyui使用过程中遇到的问题
  5. 先容Oracle中null的运用要领。
  6. Mybatis源码分析第一天------Mybatis实用篇
  7. MySQL笔记-mysql权限授权及创建用户
  8. python是什么意思中文、好学吗-学习python难吗?是不是越低级的程序越难学,越高级的程序越简单?...
  9. mysql sql参数化查询_mybatis的sql参数化查询
  10. JavaScript 3D 散点图
  11. 自监督对比损失和监督对比损失的对比
  12. 解决:Please either set ERLANG_HOME to point to your Erlang installation or place the RabbitMQ server d
  13. 计算机网络校园局域网课题,毕业论文基于VLAN技术的校园局域网建设word文档_全文免费在线阅读(推荐阅读)...
  14. 二叉树(树,森林,二叉树互转)
  15. 《面筋:拿到美团点评和去哪儿网的offer》
  16. 内置CRC于文本文件中的方法
  17. 15 款 Windows 的数据恢复工具
  18. jenkins 插件包
  19. 关于用grub4dos来做U盘启动debina系统的总结
  20. cvte2021秋招 嵌入式 offer 面经

热门文章

  1. Python数据分析案例11——灰色预测法预测时间序列数据
  2. java基于springboot+vue的宠物商店领养挂失管理系统 element 前后端分离
  3. 设备像素、css像素、设备独立像素、dpr、ppi 之间的区别
  4. element表格默认选中
  5. 二叉树的C++、Python实现及遍历
  6. 电脑老是找不到打印机怎么解决方法
  7. XP修改桌面路径方法
  8. linux 读取mic的数据,Linux管道音频文件到麦克风输入
  9. 6410的eboot阶段av输出
  10. Chrome调试工具的使用,浏览器截图方法