当前位置:   article > 正文

android之注册registerReceiver

android中非activity如何注册和解注册
image.png

BroadcastReceiver

广播作为四大组件之一,使用方式也是多种多样的,既可以自己在manifest中注册,也可以在java代码中动态注册,既可以接收由系统发出的广播,也可以接受自己定义并发送的广播。

广播可以实现进程内以及跨进程之间的通信。

roadcastReceiver分类
  • 从注册方式上区分:动态注册以及静态注册(显示广播和隐式广播)
  • 从发送方式上区分:无序广播和有序广播
  • 从处理类型上区分:前台广播和后台广播
  • 从运行方式上区分:普通广播和Sticky广播(已弃用)
  • 从发送者区分:系统广播和自定义广播

BroadcastReceiver作为Android四大组件之一,不像Activity,没有可显示的界面。

BroadcastReceiver包括两个概念,广播发送者和广播接收者(Receiver),这里的广播实际就是指Intent,程序可以自己发送广播自己接收,也可以接受系统或其他应用的广播或是发送广播给其他应用程序。

发送者可以通过类似Context.sendBroadcast接口发送广播.

接收者通过Context.registerReceiver()动态注册或在AndroidManifest.xml文件中通过<receiver>标签静态注册.

注册完成后,当发送者发送某个广播时系统会将发送的广播(Intent)与系统中所有注册的符合条件的接收者(Receiver) 的IntentFilter进行匹配,若匹配成功则执行相应接收者的onReceive函数,匹配规则见Intent和IntentFilter的匹配规则。

IntentFilter(Intent过滤器)

一个 Activity 也可以有多个 IntentFilter,相当于多了几个过滤器,被筛选到的可能就更大了。

  1. <activity
  2. android:name=".activity.launchmode.SingleTaskActivity"
  3. android:alwaysRetainTaskState="true"
  4. android:label="singleTask"
  5. android:launchMode="singleTask"
  6. android:taskAffinity="top.shixinzhang.task2">
  7. <intent-filter>
  8. <action android:name="top.shixinzhang.action.test"/>
  9. <category android:name="android.intent.category.DEFAULT"/>
  10. <category android:name="top.shixinzhang.category.test"/>
  11. <data android:mimeType="text/plain"/>
  12. </intent-filter>
  13. <intent-filter>
  14. <action android:name="android.intent.action.VIEW"/>
  15. <category android:name="android.intent.category.DEFAULT"/>
  16. <category android:name="android.intent.category.BROWSABLE"/>
  17. <data
  18. android:host="myapp.mycompany.com"
  19. android:scheme="myapp"/>
  20. </intent-filter>
  21. </activity>
IntentFilter 的匹配规则
action 的匹配规则

action 可以理解为一个组件具备功能、可以进行什么操作。系统为我们提供了很多内置的 action,当然也可以自定义。

  1. <intent-filter>
  2. <action android:name="android.intent.action.EDIT" />
  3. <action android:name="android.intent.action.VIEW" />
  4. ...
  5. </intent-filter>

Intent 中的 action 至少有一个与过滤器的匹配,才能调用这个过滤器所在的组件,否则无法命中。

action名称作用备注
android.intent.action.MAIN标识 Activity 为一个程序的开始-
android.intent.action.CALL呼叫指定的电话号码-
android.intent.action.DIAL用拨号面板-
andriod.intent.action.ALL_APPS列出所有的应用-
android.intent.action.ANSWER处理呼入的电话-
android.intent.action.VIEW显示用户的数据通用,可以是电话、浏览器等
android.intent.action.SENDTO发送消息可以是短信、彩信、邮件等
android.intent.action.EDIT对给定数据以编辑的形式访问-
android.intent.action.PICK从列表中选择信息一般用于选择联系人或者图片等
android.intent.action.CHOOSER显示一个Activity选择器比如常见的选择分享到哪里
category匹配规则

category 即分类,和 action 一样,一个过滤器可以包含多个分类:

  1. <intent-filter>
  2. <category android:name="android.intent.category.DEFAULT" />
  3. <category android:name="android.intent.category.BROWSABLE" />
  4. ...
  5. </intent-filter>

和 action 匹配规则(有一个匹配即可)不同的是,category 匹配时,要求你的 Intent 中的 category 必须和过滤器中声明的完全匹配。

例,startActivity(intent) 中的 intent 的分类不能是 android.intent.category.DEFAULT 和 android.intent.category.BROWSABLE 以外的。

image.png
data匹配规则

data 表示该组件可以支持的数据格式与类型。

同样,一个过滤器也可以有多个 data:

  1. <intent-filter>
  2. <data android:mimeType="video/mpeg" android:scheme="http" ... />
  3. <data android:mimeType="audio/mpeg" android:scheme="http" ... />
  4. ...
  5. </intent-filter>

一个 data 由mimeType和scheme组成。

mimeType指的是支持的数据类型与格式,常见的有:

  • text/plain
  • image/jpeg
  • video/*
  • audio/*

/ 号前面的是数据类型,后面是具体格式。

scheme 就是常见的 URI 格式:

<scheme>://<host>:<port>/<path>
参数含义说明
scheme协议类型最重要,协议类型决定了如何访问数据,比如是本地还是网络
host主机第二重要,主机地址决定了具体 ip
port端口第三重要,一个主机可能有多个网卡端口,有了端口后才能访问到具体
path具体路径最后一级,表示要访问的文件夹路径

例如:

  1. http://www.baidu.com:80/search/info
  2. file://emulator/0/sdcard/shixinzhang

scheme 和 mimeType 组成一个 data。而 data 的匹配规则就是:intent 中的 data 至少可以匹配过滤器中的一个。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/935070
推荐阅读
相关标签
  

闽ICP备14008679号