热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无所不知的BroadcastReceiver

**广播接收器是一种用于响应系统范围广播通知的组件。许多广播都是由系统发起的—例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播应用也可以发起广播—例如,通知其他应用某些数据已下载至设备,并且
/**

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

基础识记

        /**
* 广播
* 1、如果你不需要在应用之间进行发送的话则可以使用LocalBroadcastManager,这个类只是在本进程内进行是安全的
* 2、如果你使用Manifest里面注册的广播接受者,不希望其它的应用程序去发送到你这个接受者里面你需要加入android:exported="false"
* 广播分为有序广播和无序广播
* 有序广播:广播按照一定的顺序去执行,执行规则:
* 1、如果在Manifest里面设置了优先级从高到低的顺序执行
* 2、如果优先级相同或者没有设置优先级则按程序执行顺序从上到下开始接受广播
* 3、如果是不同的应用则按应用的安装顺序进行执行
* 无序广播:具有相同行为的广播都能接受到
* 1、当多个应用程序都有你的广播接受者,而你想让其中的一个应用去接受你需要为Intent设置setPackage()
*/
发送顺序广播

        Intent intent = new Intent();
intent.setAction("com.andly.basic");
//intent 意图
//receiverPermission 接受需要的权限
//resultReceiver 指定最后执行的Receiver(此receiver一定会执行)
//initialCode 结果码通常是RESULT_OK
//initialData 初始化的字符串
//initialExtras 初始化的数据 类型为Bundle
sendOrderedBroadcast(intent, null, null, null, 0, "A", null);
在Android官方文档里面解释说不许在BroadcastReceiver里面直接开启Activity和绑定服务,可以startService,原因是因为BroadcastReceiver和Activity操作是不同的,一个运行在后台一个运行在前台。但是查看源码可以看到BroadcastReceiver里面的Context实际是ReceiverRestrictedContext类,当你需要从BroadcastReceiver里面跳转到Activity加上NEW_TASK

Intent intent1 = new Intent(context, MainActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);

从代码角度来解释一下原因:1、在BroadcastReceiver里面不能绑定服务和注册广播  2、在BroadcastReceiver里面不能直接开启Activity

1、在BroadcastReceiver里面不能绑定服务和注册广播

先了解一下这个类的继承关系:

查看ReceiverRestrictedContext类:


可以看到它的registerReceiver和BindService实现都抛出了一个不被允许的异常。

2、在BroadcastReceiver里面不能直接开启Activity

查看ContextImpl的源码startActivity方法

这样看到这条件便知道为啥不能在BroadcastReceiver里面直接startActivity了,然后查看Android7.0的源码

可以惊奇的发现这方法做了优化经过测试在Android7.0可以不用加NEW_TASK就能进行跳转.估计是做了优化。

接下来介绍一下接受系统广播的例子。

1、接收开机启动的广播

permission:

    
receiver:

        





2、接受拨打电话的广播

permission:

    
receiver:

        




3、接受接收短信的广播

permission:

    
receiver:

        



4、接受SD卡是否挂载广播

receiver:

        






5、接受应用程序是否卸载广播

receiver:

        








推荐阅读
  • 本文详细介绍了如何在Android应用中实现重复报警功能。示例代码可在以下路径找到:https://developer.android.com/samples/RepeatingAlarm/index.html。首先,我们将从Manifest文件开始分析。 ... [详细]
  • 如何在PHP中安装Xdebug扩展
    本文介绍了如何从PECL下载并编译安装Xdebug扩展,以及如何配置PHP和PHPStorm以启用调试功能。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 本文将在前几篇关于Android测试理论知识的基础上,通过ApiDemoTest实例详细探讨如何使用ApplicationTestCase进行Android应用测试。建议读者先阅读Android测试教程系列中的相关内容,以便更好地理解本文的实践部分。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
  • 本文详细介绍了Android系统的四层架构,包括应用程序层、应用框架层、库与Android运行时层以及Linux内核层,并提供了如何关闭Android系统的步骤。 ... [详细]
  • 本文详细介绍了HashSet类,它是Set接口的一个实现,底层使用哈希表(实际上是HashMap实例)。HashSet不保证元素的迭代顺序,并且是非线程安全的。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • PyCharm 安装与首个 Python 程序实践
    本文将指导您如何安装 PyCharm,并通过创建一个简单的 'Hello, World' 程序来初步体验这一强大的 Python 集成开发环境。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 本文介绍了一个使用Spring框架和Quartz调度器实现每周定时调用Web服务获取数据的小项目。通过详细配置Spring XML文件,展示了如何设置定时任务以及解决可能遇到的自动注入问题。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
author-avatar
金花婆婆2502921867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有