Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
FeatherHunter opened this issue Apr 10, 2019 · 9 comments
Open
Labels

Comments

@FeatherHunter
Copy link
Collaborator

No description provided.

@canyie
Copy link

canyie commented Apr 11, 2019

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

@18361237136
Copy link

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

@MoJieBlog
Copy link
Collaborator

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

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

@JereChen11
Copy link

JereChen11 commented Aug 15, 2019

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() 去关闭它。

博客原文链接,虚心请教

@siren4
Copy link

siren4 commented Aug 29, 2019

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必须同时满足这三者的过滤规则。
在同一个应用中,尽量使用显示意图,因为显示意图比隐式意图的效率高。

@yline
Copy link

yline commented Dec 20, 2019

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

@zhouyueyuedsf
Copy link

zhouyueyuedsf commented Jun 21, 2020

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

@YuxiangZhu
Copy link

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

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

@mlinqirong
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests