Android开发艺术探索---第一章intentFilter匹配规则之自我总结

前言:
我们知道,启动android应用的核心组件:activity、服务都必须使用到intent,广播接收器则需要使用到intent-Filter
intent分为显示意图和隐示意图,当显示调用和隐示调用共存时,以显示调用为主

显示意图:
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件信息得Intent为显式意图,显式意图明确指定了那个组件的包名和类名。
如:
Intent intent = new Intent();
intent.setAction(Activity1.this,Activity2.class);
startActivity(intent);
通常当我们开启自己应用的activity会使用显示调用,为什么呢?因为tmd简单,方便(如果你用隐式,只能说明一个问题:naocan)

隐示意图:
补充知识点:
当android:exported=”false”时,activity是不能被其他应用启动的
当IntentFilter不存在时,默认情况下android:exported=”false”
当IntentFilter存在时,默认情况下android:exported=”true”
(默认情况就是:大秘密下飞机,助理拿包;也就是你啥都不要做,系统就帮你做了)
隐示意图需要intent能够匹配IntentFilter中所设置的过滤信息,如果不匹配则会无法启动目标activity,IntentFilter中过滤信息有action、catagory、data;另外一点一个activity中可以有多个intent-filter,intent只要匹配其中一组就可以启动目标activity

  1. action的匹配规则:
    action是一个字符串,系统预定义的一些action,同时我们也可以自己定义action;
    过滤规则中可以有多个action,intent只要匹配其中一个action即可,
    如果intent中没有指定action,那只能说匹配个毛

  2. category的匹配规则:
    这个比较贱,为什么贱呢?那就看看把
    category也是一个字符串,和action一样,系统也预定义了一些,我们也可以自己定义
    过滤规则中可以有多个category,intent中可以不指定category,如果指定category,那必须所有的指定的category必须和过滤规则中的一样,才能启动activity
    为何说可以没有呢?
    答:因为intent-filter和intent他俩是相好的,时时刻刻想着鹊桥相会;
    第一:为了我们的activity能接收隐式调用,必须在过滤规则中指定android:name=”android.intent.category.DEFAULT”这个category
    第二:当我们startActivity或者startActivityForResult时,系统会为intent加上android.intent.category.DEFAULT这个category
    结果呢?仿如异地恋的小情侣一般,蓄势待发!!!

  3. data的匹配规则:

    课外延伸:
    参考地址:http://blog.csdn.net/akkaruta/article/details/51770351
    URN(Uniform Resource Name):统一资源名称
    唯一标识一个实体的标识符,但是不给出实体的位置,通过引用一个或多个URL来实现标识指针功能。现实中可见的使用:P2P下载中使用的磁力链接。

    URL(Uniform Resource Locator):统一资源定位符
    顾名思义,URL就是一个表示资源位置的字符串,基本的URL格式为 “协议://IP地址/路径和文件名”,如:ftp://ftp.is.co.za/rfc/rfc1808.txt
    最重要的一点,URL对于我们而言,就是将URL输入到浏览器地址栏上就可以访问到对应资源。

    URI(Uniform Resource Identifier):统一资源标识符
    “A Uniform Resource Identifier (URI) 是一个紧凑的字符串用来标示抽象或物理资源”,来自RFC中的定义。可以看出其和URL的目的是相同的,都是通过使用字符串来标示资源,这样看来,像开头绿色字体部分的字符串似乎并不能完整标识资源。

这里要说明一下,为什么要有这个课外延伸呢?因为我怕一些小伙伴看到我的文章后,不理解啥是uri和url(同时我就是那个小伙伴)
好的,延伸参考了,犊子也扯了,那就开始正题了

data的匹配规则:如果过滤规则中定义了data,intent中必须也要定义可匹配的data
注意:

  1. 过滤规则中可以没有data,此时intent无需匹配
  2. 过滤规则中可以有多组data,此时intent中只要匹配其中一组data即可

data是毛物?data就是加了媒体限制的uri;为啥这么说呢?
因为data由两个部分组成分别是mimeType和uri;
mimetype:是指媒体类型,比如image/jpeg,audio/mepg4-generic,video/*等,可以表示图片,文本,视频等
uri:结构比较复杂,data中也可以不指定,因为系统默认uri为content和file,也就是说当不指定uri时,intent中uri部分scheme必须为content或者file
scheme:主题模式,如果么有scheme,uri是无效的
host:主机名,如果么有host,uri是无效的
port:端口号,如果么有host,post是无效的,uri中可以么有port
path,pathPattern,pathPrefix表示路径信息

注意:当intent设置data时,要调用setDataAndType(uri,type),不能调用setData和setType,因为它们会把对方置空

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值