四大组件之(四)广播接收器

广播接收器是一种用于响应系统范围广播通知的组件。 许多广播都是由系统发起的 — 例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可以发起广播 — 例如,通知其他应用某些数据已下载至设备,并且可供其使用。 尽管广播接收器不会显示用户界面,但它们可以创建状态栏通知,在发生广播事件时提醒用户。 但广播接收器更常见的用途只是作为通向其他组件的“通道”,设计用于执行极少量的工作。 例如,它可能会基于事件发起一项服务来执行某项工作。

广播接收器作为 BroadcastReceiver 的子类实现,并且每条广播都作为 Intent 对象进行传递。 如需了解详细信息,请参阅 BroadcastReceiver 类。

Android 系统设计的独特之处在于,任何应用都可以启动其他应用的组件。 例如,如果您想让用户使用设备的相机拍摄照片,很可能有另一个应用可以执行该操作,那么您的应用就可以利用该应用,而不是开发一个 Activity 来自行拍摄照片。 您不需要集成甚至链接到该相机应用的代码,而是只需启动拍摄照片的相机应用中的 Activity。 完成拍摄时,系统甚至会将照片返回您的应用,以便您使用。对用户而言,就好像相机真正是您应用的组成部分。

当系统启动某个组件时,会启动该应用的进程(如果尚未运行),并实例化该组件所需的类。 例如,如果您的应用启动相机应用中拍摄照片的 Activity,则该 Activity 会在属于相机应用的进程,而不是您的应用的进程中运行。因此,与大多数其他系统上的应用不同,Android 应用并没有单一入口点(例如,没有 main() 函数)。

由于系统在单独的进程中运行每个应用,且其文件权限会限制对其他应用的访问,因此您的应用无法直接启动其他应用中的组件, 但 Android 系统却可以。因此,要想启动其他应用中的组件,您必须向系统传递一则消息,说明您想启动特定组件的 Intent。 系统随后便会为您启动该组件。

App可以通过两种方式来接收广播:通过manifest文件声明,通过context-registered receivers.

Manifest-declared receivers

Note: If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for implicit broadcasts (broadcasts that do not target your app specifically), except for a few implicit broadcasts that are exempted from that restriction. In most cases, you can use scheduled jobs instead.

api26或以上版本不能采用这种方式来声明广播

1. 在manifest文件中声明<receiver>

5777390-0f4a773fa2b2804f.png

2. 提供 BroadcastReceiver 的子类,并且实现onReceive(Context, Intent)

5777390-cb1eb31ad7ad5aa3.png

系统包管理器会在app被安装的时候注册这个receiver,这个receiver就会变成你的app的单独的入口,如果你的app当前没有运行,系统就可以启动你的app并且投递这个广播。系统就会创建一个新的BroadcastReceiver组件对象来管理每一个接收到的广播。这个对象只有在调用onRecieve方法时候生效,一旦这个方法结束并且返回,系统就会认为组件不再活跃。

一般可以使用Context-registered receivers的方式来实现广播

通过以下几步注册一个广播

1. 创建BroadcastReceiver实例

BroadcastReceiver br = new MyBroadcastReceiver();

2. 创建IntentFilter并且通过registerReceiver(BroadcastReceiver, IntentFilter):注册这个receiver

//这个是注册系统的

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);

this.registerReceiver(br, filter);

Note: 如果要注册本地的广播, 调用 LocalBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter).

3. 调用unregisterReceiver(android.content.BroadcastReceiver)来注销广播接收器

4.需要注意注册和注销广播的时机,最好是成对出现。比如onCreate(Bundle)注册,在 onDestroy()方法中注销。在onResume()中注册,在onPause()方法中注销。

5777390-c71e2193f752e518.png

发送广播

5777390-028967189b5822e8.png

广播消息被封装在了intent对象中。intent action字符串必须是app java包名,并且保证这个名称是唯一的。可以同时在intent中添加其他的数据,也可以同时使用setPackage(String) 来将广播限定为同一个组织发布的一系列app通用广播。

Note: Although intents are used for both sending broadcasts and starting activities with startActivity(Intent), these actions are completely unrelated. Broadcast receivers can't see or capture intents used to start an activity; likewise, when you broadcast an intent, you can't find or start an activity.

一般情况下使用本地广播比较多,也比较好的保证数据隐私性,demo如下:

5777390-ad25d0de0d006604.png
5777390-26c2d632c512f4a8.png
5777390-c56a2201b66e1b11.png

百度网盘 提取码: 2ipj

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值