以前做的东西都是在一个进程内的,基本没用到Intent-filter,今天在自学的时候遇到了垮进程访问service的需求,由此联想到了一些应用比如QQ的通过QQ消息直接打开腾讯新闻的Activity之类的功能,所以有了以下疑问。
先说下我理解的:Intent-filter是为了让Intent在实现隐式意图的时候,查找到合适的对象(Activity,Service,BroadcastReceiver),所设置的过滤机制。我个人猜测,当我们发动一个隐式意图时,系统会查找所有已安装的包,找到符合我们意图的组件,将其激活。这个查找方式嘛,应该是先通过指定的action过滤,然后通过指定的category过滤,最后通过data过滤(可能是不分顺序,反正三者都要通过)。
接下去说下问题:
1.这个category属性 是否只是为了做二重过滤使用,假设我所有的action都使用不同名字,那category得存在就没有意义了?还是说,这其实是一种安全机制,防止别的应用随意调用你的组件?还是说,这其实是为了使代码实现复用,当多种情况使用同一组件时,可以通过判断发送者即category的不同,实现不同功能?
2.在设置了Intent-filter后,该如何保证自己的组件不被别人调用?
3.在我自己的应用内调用另外一个进程的组件时,我是自己通过给intent赋值适当的过滤条件来达到目的的。但是类似音乐播放器之类的应用,当你打开一个音乐文件时,系统会弹出选择框让你选择应用来播放,一些文本查看器软件也有类似功能。我想知道,这是不是操作系统本身帮你封装了“打开音乐文件”和“打开文本文件”这一操作,使其相当于发送了一个Intent。类似的,当我们在自己的应用内调用打电话功能,
Intent intent = new Intent( Intent.ACTION_CALL, Uri.parse("tel:10010")
其实也就是调用了操作系统定义好的一个打电话的组件。