Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-04-11:IntentFilter是什么?有哪些使用场景?

FeatherHunter opened this issue · comments

2019-04-11:IntentFilter是什么?有哪些使用场景?

IntentFilter直译:意图过滤器,可以给四大组件配置自己关心的action等,以免想打开A结果打开了B
使用场景就太多了,比如Receiver需要指定intent-filter来表明自己关心什么广播等

过滤意图,主要是用在发广播时使用

单从manifest层面讲intentFilter下有三个参数,action,data,category。

  • action:可以用来指定操作。常见的是在receiver中过滤广播,和隐式意图打开界面
  • category:目标操作的类别(个人这么叫),用来区别打开浏览器,打开页面等等
  • data:就是数据了

4.1 IntentService是什么

IntentService是Service的子类,继承与Service类,用于处理需要异步请求。用户通过调用Context.StartService(Intent)发送请求,服务根据需要启动,使用工作线程依次处理每个Intent,并在处理完所有工作后自身停止服务。

使用时,扩展IntentService并实现onHandleIntent(android.content.Intent)。IntentService接收Intent,启动工作线程,并在适当时机停止服务。

所有的请求都在同一个工作线程上处理,一次处理一个请求,所以处理完所以的请求可能会花费很长的时间,但由于IntentService是另外了线程来工作,所以保证不会阻止App的主线程。

4.2 IntentService与Service的区别
从何时使用,触发方法,运行环境,何时停止四个方面分析。

4.2.1 何时使用

Service用于没有UI工作的任务,但不能执行长任务(长时间的任务),如果需要Service来执行长时间的任务,则必须手动开店一个线程来执行该Service。
IntentService可用于执行不与主线程沟通的长任务。

4.2.2 触发方法

Service通过调用 startService() 方法来触发。
而IntentService通过Intent来触发,开启一个新的工作线程,并在线程上调用 onHandleIntent() 方法。

4.2.3 运行环境

Service 在App主线程上运行,没有与用户交互,即在后台运行,如果执行长时间的请求任务会阻止主线程工作。
IntentService在自己单独开启的工作线程上运行,即使执行长时间的请求任务也不会阻止主线程工作。

4.2.4 何时停止
如果执行了Service,我们是有责任在其请求任务完成后关闭服务,通过调用 stopSelf() 或 stopService()来结束服务。
IntentService会在执行完所有的请求任务后自行关闭服务,所以我们不必额外调用 stopSelf() 去关闭它。

博客原文链接,虚心请教

1.IntentFilter是意图过滤器,常用于Intent的隐式调用匹配。
2.IntentFilter有3种匹配规则,分别是action、categroy、data。

action的匹配原则:
IntentFilter可以有多个action,Intent最多能有1个。
1.如果IntentFilter中不存在action,那么所有的intent都无法通过。
2.如果IntentFilter存在action。
a.如果intent不存在,那么可以通过。
b.如果intent存在,那么intent中的action必须是IntentFilter中的其中一个,对比区分大小写。

category的匹配原则:
IntentFilter可以有多个category,Intent也可以有多个。
1.如果IntentFilter不存在category,那么所有的intent都无法通过,因为隐式调用的时候,系统默认给Intent附加了“android.intent.category.DEFAULT”。
2.如果IntentFilter存在category
a.如果intent不存在,可以通过。
b.如果intent存在,那么intent中的所有category都包含在IntentFilter中,才可以通过。

data的匹配原则:
IntentFilter可以有多个data,Intent最多能有1个。
IntentFilter和Intent完全匹配才能通过,也适用于通配符。

匹配规则:
Intent需要匹配多组intent-fliter中的任意一组,每一组包含action、data、category,即Intent必须同时满足这三者的过滤规则。
在同一个应用中,尽量使用显示意图,因为显示意图比隐式意图的效率高。

commented

1.IntentFilter是意图过滤器,常用于Intent的隐式调用匹配。
2.IntentFilter有3种匹配规则,分别是action、categroy、data。

action的匹配原则:
IntentFilter可以有多个action,Intent最多能有1个。
1.如果IntentFilter中不存在action,那么所有的intent都无法通过。
2.如果IntentFilter存在action。
a.如果intent不存在,那么可以通过。
b.如果intent存在,那么intent中的action必须是IntentFilter中的其中一个,对比区分大小写。

category的匹配原则:
IntentFilter可以有多个category,Intent也可以有多个。
1.如果IntentFilter不存在category,那么所有的intent都无法通过,因为隐式调用的时候,系统默认给Intent附加了“android.intent.category.DEFAULT”。
2.如果IntentFilter存在category
a.如果intent不存在,可以通过。
b.如果intent存在,那么intent中的所有category都包含在IntentFilter中,才可以通过。

data的匹配原则:
IntentFilter可以有多个data,Intent最多能有1个。
IntentFilter和Intent完全匹配才能通过,也适用于通配符。

匹配规则:
Intent需要匹配多组intent-fliter中的任意一组,每一组包含action、data、category,即Intent必须同时满足这三者的过滤规则。
在同一个应用中,尽量使用显示意图,因为显示意图比隐式意图的效率高。

匹配规则,貌似说反了。具体可参照:https://blog.csdn.net/u011240877/article/details/71305797

路由框架 就是用intentFilter实现的吧

路由框架 就是用intentFilter实现的吧

我认为不是,我理解的路由框架是由注解处理器和javapoet共同完成把activity注册到路由表的过程,而不是通过隐式调用来实现的,仅是探讨,说的不对的地方请指教

intentFilter 意图过滤器 可以给广播和activity添加启动过滤
通过action匹配意图动作