Android DevArt4:IntentFilter学习及深入~问题描述:在不指定具体action前提下,如果有两个以上的Activity,具有完全相同的intent-filter,项目同步是否会出现异常?程序运行是否会崩溃?
概述:GitHub
IntentFilter意图过滤器,三种匹配规则:action、category、data
重点:过滤规则中必须设置 '<category android:name="android.intent.category.DEFAULT" />' ,否则不生效。
同样也说明了addCategory是一个叠加的属性。其源码内部是一个 ArraySet
先做几个演示:
入口Activity:

public class SelectFilterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_filter);
}
/**
* 通过自定义action跳转,不设置category(系统在startActivity/startActivityForResult时默认为Intent加上DEFAULT),设置相应的data
*
* @param view
*/
public void action1(View view) {
Intent intent = new Intent();
intent.setAction("com.action.123");
// intent.addCategory("");
//注意:不能先setData在setType,因为这两个方法彼此会清除对方的值,详见源码
intent.setDataAndType(Uri.parse("content://"), "text/plain");
startActivity(intent);
}
/**
* 通过自定义action跳转,设置自定义category,设置相应的data
*
* @param view
*/
public void action2(View view) {
Intent intent = new Intent("com.action.1");
intent.addCategory("com.category.abc.2");
intent.setDataAndType(Uri.parse("http://www.baidu.com:8080"), "image/*");
startActivity(intent);
}
/**
* 不设置action,设置自定义category,设置相应的data
*
* @param view
*/
public void category1(View view) {
Intent intent = new Intent();
intent.addCategory("com.category.mif3");
intent.setDataAndType(Uri.parse("file://abc"), "video/*");
startActivity(intent);
}
}
相应的AndroidMenifest.xml中的过滤规则:(其中MyIntentFilterActivity1~5均为测试用的EmptyActivity)
<!-- Android意图过滤器 -->
<activity android:name=".Chapter1.intentfilter.SelectFilterActivity" />
<activity android:name=".Chapter1.intentfilter.MyIntentFilterActivity">
<intent-filter>
<!-- 区分大小写 -->
<action android:name="com.action.1" />
<action android:name="com.action.2" />
<!--
系统在startActivity或startActivityForResult时会默认为 Intent 加上DEFAULT ,
所以为了使我们新建的Activity能够接收隐式调用,就必须在intent-filter中添加DEFAULT的category属性
-->
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.category.abc.1" />
<category android:name="com.category.abc.2" />
<!-- 注:如果过滤规则中定义了data,那么Intent中也必须要定义可匹配的data -->
<!-- scheme 默认为content和file -->
<!-- 不通data标签中的scheme、mimeType属性通用,host、port不通用 -->
<data
android:host="www.jooy.top"
android:mimeType="image/*"
android:port="80"
android:scheme="http" />
<data
android:host="www.baidu.com"
android:port="8080"
android:scheme="content" />
</intent-filter>
</activity>
<activity android:name=".Chapter1.intentfilter.MyIntentFilterActivity2">
<intent-filter>
<action android:name="com.action.123" />
<!-- 要么自定义,要么用DEFAULT,否则隐式跳转失败,并抛出异常 ActivityNotFoundException -->
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" />
<data android:mimeType="audio/*" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity> <activity android:name=".Chapter1.intentfilter.MyIntentFilterActivity3">
<intent-filter>
<action android:name="com.action.mif3" />
<category android:name="android.intent.category.DEFAULT" /> <!-- 必须有 -->
<category android:name="com.category.mif3" />
<!-- scheme 默认值 content/file -->
<data android:mimeType="video/*" />
</intent-filter>
</activity>
<activity android:name=".Chapter1.intentfilter.MyIntentFilterActivity4">
<intent-filter>
MyIntentFilterActivity3
</intent-filter>
</activity>
<activity android:name=".Chapter1.intentfilter.MyIntentFilterActivity5">
<intent-filter>
MyIntentFilterActivity3
</intent-filter>
</activity>
回归正文:
问题描述:
在不指定具体action前提下(Intent跳转时可以不setAction,但清单文件中必须有action的过滤 <action android:name="com.action.mif3"/>),
如果有多个Activity:MyIntentFilterActivity4,5和MyIntentFilterActivity3等的intent-filter完全相同,
项目同步是否会出现异常?程序运行是否会崩溃?。
答案是程序不会崩溃,系统会从底部弹窗,按照清单文件注册Activity的顺序依次排列,Act3..Act4..Act5...,点击进入相应的Activity,
just like this:

可见,在隐式跳转中,如果不指定具体的action名称(字符串),而是intent仅通过category+data类型去找相应的activity的话,可能会返回来一个Activity的集合,也可能返回空,那么此时就需要PackageManager出场了。
PackageManager两个api:(1)resolveActivity 方法,如果找不到目标act就返回null。Intent中也有该API,效果相同;(2)queryIntentActivities方法:返回所有成功匹配的act信息。
而且,针对Service和BroadcastReceiver等组件,PM同样提供了类似的方法获取匹配信息,如queryIntentServices、queryBroadcastReceivers等方法。
还差点东西。。。

上面说列表显示顺序是按照menifest的配置顺序排列的,我们调换下顺序
MyIntentFilterActivity3→MyIntentFilterActivity4→MyIntentFilterActivity5
改为:
MyIntentFilterActivity5→MyIntentFilterActivity4→MyIntentFilterActivity3

GitHub
如果这篇随记对你有所帮助,请点个赞吧。发起进攻( ´-ω ・)▄︻┻┳══━一
‧★,:*:‧\( ̄▽ ̄)/‧:*‧°★*
Android DevArt4:IntentFilter学习及深入~问题描述:在不指定具体action前提下,如果有两个以上的Activity,具有完全相同的intent-filter,项目同步是否会出现异常?程序运行是否会崩溃?的更多相关文章
- Android Google官方文档(cn)解析之——Intents and Intent filter
应用程序核心组件中的三个Activity,service,还有broadcast receiver都是通过一个叫做intent的消息激活的.Intent消息传送是在相同或不同的应用程序中的组件之间后运 ...
- Android从启动到程序运行整个过程的整理
1Android是基于Linux的一个操作系统,它可以分为五层,下面是它的层次架构图,可以记一下,因为后面应该会总结到SystemServer这些Application Framework层的东西 A ...
- 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
今天运行程序是出现了this application has requested the runtime to terminate it in an unusual way. 的异常报告,以前也经常 ...
- android: 将程序运行到手机上
8.3.1 将程序运行到手机上 不必我多说,首先你需要拥有一部 Android 手机.现在 Android 手机早就不是什么稀罕 物,几乎已经是人手一部了,如果你还没有话,抓紧去购买吧. 想要将程 ...
- Qt opencv程序运行异常
搭建了两次qt opencv vs ,经常出现程序运行异常.找了几个原因如下: 1.opencv的路径未配置或配置有误. 2.qt中pro文件包含不正确. 3.测试opencv程序不正确.如视频或图片 ...
- Android学习之Button按钮在程序运行时全部变大写的处理
问题: 在layout布局文件中,我们命名的按钮名称是“button1”,程序运行过后,在app上显示出来的是“BUTTON1”,先看源代码和效果: 按钮源代码: 运行效果: 解决办法: 方法一: 在 ...
- GD32电压不足时烧写程序导致程序运行异常的解决方法
一直使用的GD32F450前段时间遇到这样一个问题,当使用J-Link供电给板子烧写程序之后,程序运行缓慢,就像运行在FLASH高速部分之外一样,但是如果使用外部供电烧写,就不会出现这个问题,而且一旦 ...
- Android M Permission 学习笔记
Android应用权限简要介绍 一个Android应用默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, 一个应用是没有权利去进行一些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应 ...
- Android系统源代码学习步骤
目前,互联网行业正在朝着移动互联网方向强劲地发展,而移动互联网的发展离不开背后的移动平台的支撑.众所周知,如今在移动平台市场上,苹果的iOS.谷歌的Android和微软的Windows Phone系统 ...
随机推荐
- Git及GitLab使用手册
一.GitBash安装与使用 参考: https://www.cnblogs.com/jasonxu19900827/p/7823089.html 二.SourceTree安装与使用 SourceTr ...
- 在线学习和在线凸优化(online learning and online convex optimization)—在线凸优化框架3
近年来,许多有效的在线学习算法的设计受到凸优化工具的影响. 此外,据观察,大多数先前提出的有效算法可以基于以下优雅模型联合分析: 凸集的定义: 一个向量 的Regret定义为: 如前所述,算法相对于竞 ...
- CRM stringmap
CREATE view [dbo].[V_stringmap] as SELECT DISTINCT Entity.Name as tablename,StringMap.AttributeName ...
- isNAN的使用方法及介绍
NaN为 Not a Number isNaN()函数在接到一个值后,会尝试将这个值转换为数值. alert(isNaN(NaN)); //true alert(isNaN(25)); //false ...
- jmater分布式压力测试总结
总结,总是为了方便以后 1.jmeter 2000个并发,4台slave ,每台slave是500个线程即可完成测试 2.jmx文件只需要拷贝到master下 jmeter目录下(最保险的方法) 3. ...
- Missing artifact javax.transaction:jta:jar:1.0.1B
下载https://pan.baidu.com/s/1hsfyj8S到某目录,比如: /Users/yintingting/Downloads 打开terminal,cd /Users/yinting ...
- python库pandas
由于在机器学习中经常以矩阵的方式来表现数据,那么我们就需要一种数据结构来存储和处理矩阵.pandas库就是这样一个工具. 本文档是一个学习笔记,记录一些常用的命令,原文:http://www.cnbl ...
- jq 上传下载进度条
里面只演示了下载的,挂载的是我的七牛服务器上的内容,上传事件和下载是一模一样的,为了大家不乱上传东西到我的服务器,而且我的服务器容量也不大,这里只展示了下载.代码: <!DOCTYPE html ...
- 【Python爬虫实战】微信爬虫
所谓微信爬虫,即自动获取微信的相关文章信息的一种爬虫.微信对我们的限制是很多的,所以我们需要采取一些手段解决这些限制主要包括伪装浏览器.使用代理IP等方式http://weixin.sogou.com ...
- First C++
第一天接触C++,根据老师的作业写了两行代码...保存到Github了. https://github.com/BlackDn 首先是认识到自己的一些小错误,如打代码的时候会忘记这一行最后加“:”.可 ...