首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

android oreo中的广播接收器无法正常工作

在Android Oreo(API级别26)中,广播接收器的工作方式发生了一些变化,主要是为了提高电池寿命和系统性能。以下是关于Android Oreo中广播接收器无法正常工作的基础概念、原因及解决方案:

基础概念

广播接收器(Broadcast Receiver)是一种Android组件,用于接收并响应系统或应用程序发出的广播消息。广播分为两种类型:

  • 普通广播(Normal Broadcast):所有匹配的接收器都会收到广播。
  • 有序广播(Ordered Broadcast):接收器按优先级顺序接收广播。

变化

在Android Oreo中,系统对普通广播的使用进行了限制:

  • 动态注册的普通广播:仍然可以正常工作。
  • 静态注册的普通广播:在Android Oreo及更高版本中不再工作。

原因

  1. 静态注册的普通广播:在Android Oreo中,静态注册的普通广播不再被系统处理。
  2. 后台限制:Android Oreo引入了后台执行限制,限制了后台服务的能力,可能会影响广播接收器的正常工作。

解决方案

1. 使用动态注册

将静态注册的广播接收器改为动态注册。动态注册的广播接收器在应用程序运行时有效。

代码语言:txt
复制
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理广播
    }
}

// 在Activity或Service中动态注册
IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver(receiver, filter);

2. 使用JobIntentService

对于需要在后台执行的任务,可以使用JobIntentService来替代传统的Service

代码语言:txt
复制
public class MyJobIntentService extends JobIntentService {
    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // 处理任务
    }
}

// 启动JobIntentService
Intent intent = new Intent(this, MyJobIntentService.class);
startService(intent);

3. 使用LocalBroadcastManager

对于应用程序内部的广播,可以使用LocalBroadcastManager,它只在应用程序内部传递广播,不会被系统或其他应用程序接收。

代码语言:txt
复制
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理广播
    }
}

// 在Activity或Service中注册
IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);

4. 使用Firebase Cloud Messaging (FCM)

对于需要跨应用程序通信的场景,可以使用Firebase Cloud Messaging (FCM)来替代传统的广播机制。

代码语言:txt
复制
public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // 处理消息
    }
}

参考链接

通过以上方法,可以解决Android Oreo中广播接收器无法正常工作的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

咦,Oreo怎么收不到广播了?

Android8.0后台执行限制 注意是针对targetSDK >= 26应用,也就是说,targetSDK小于26的话,暂不受影响 在Oreo,为了进一步提升用户体验,进一步节省功耗,对应用在后台运行时可以执行操作又进一步施加了限制...所以从Android 7.0 (API 级别 24)开始,就对广播做了一些限制: API24及以上应用,静态注册广播接收器无法监听网络变化:android.net.conn.CONNECTIVITY_CHANGE...只不过,在Android8.0上,又进一步增强了限制,除了以下隐式广播外,其他所有隐式广播无法通过在AndroidManifest.xml中注册监听 // Android 8.0 上不限制隐式广播..." */ "保留原因:这些广播只有拥有特定系统权限app才能监听,因此大多数正常应用都无法接收它们。"...动态通过调用 Context.registerReceiver()注册广播接收器而不是在清单声明接收器。 使用JobScheduler,这个网上找一下,有很多教程,就不细说了。

2K40

解决 requests 库 Post 请求路由无法正常工作问题

解决 requests 库 Post 请求路由无法正常工作问题是一个常见问题,也是很多开发者在使用 requests 库时经常遇到问题。本文将介绍如何解决这个问题,以及如何预防此类问题发生。...问题背景用户报告,Post 请求路由在这个库不能正常工作。用户使用了 requests 库,并遇到了问题。用户还提供了详细错误信息和系统信息。...,用户试图通过 requests 库发送一个 Post 请求到 API 端点,但是请求无法成功。...用户已经确认使用了正确请求方法和参数,但是仍然无法解决问题。...这些信息可以帮助我们找出问题原因。错误信息和系统信息是解决任何问题关键。错误信息通常包含问题具体描述,例如错误类型、错误代码、错误原因等。

43420
  • 在KVM加速Qemu运行Android Oreo

    本文你将学习到如何在KVM加速Qemu运行Android Oreo (8.1.0) 系统,并通过我们Linux x86_64主机上运行Burp Suite,转发所有来自Android流量。...我们将在一个名为$ANDROID-QEMU目录工作(你可以随意调用它,我只是在这里给它分配了一个虚拟变量名),并创建一个10 Gigs大小虚拟disk.img。...在进行了系统更新,网络测试等工作后。现在我们已准备好了进入下一阶段,在Android系统cacert目录安装一个自定义CA,这样我们就可以截获Burp Suite传出/传入HTTPS流量。...我所知道唯一方法,是将自定义证书添加到/system/etc/security/cacert根文件系统。...接下来,我们需要告诉Android用于WiFi连接代理地址和端口,我们只需重新配置网络即可(这里我花了一点时间才找到,代理设置被隐藏在了Oreo)。 ? ? 它必须看起来像上面一样。

    5.3K31

    谷歌大开“吃”戒产物,Andriod O全球发布

    据猜测,正式版命名很有可能是Oreo(奥利奥),谷歌工程师真的是如此钟爱甜食。...后台服务限制:处于空闲状态时,应用可以使用后台服务存在限制。 这些限制不适用于前台服务,因为前台服务更容易引起用户注意。 广播限制:除了有限例外情况,应用无法使用清单注册隐式广播。...4、WebView 增强功能: 在 Android Nougat ,我们针对 WebView 推出了一个可选多进程模式,其将网页内容处理转移到一个隔离进程。...⑤在应用正常处于前台之前,请推迟后台工作。 3、检查在您应用清单定义广播接收器。 如果您清单为显式广播声明了接收器,您必须予以替换。...可能解决方法包括: ①通过调用 Context.registerReceiver() 而不是在清单声明接收器方式在运行时创建接收器。 ②使用计划作业检查条件是否会触发隐式广播

    91220

    Android8.0隐式广播和自定义签名权限

    Android官网:Oreo后台执行限制 我们这里主要看对于广播影响,摘抄一段官网上介绍: 广播限制 如果应用注册为接收广播,则在每次发送广播时,应用接收器都会消耗资源。...适配 Android 8.0 或更高版本应用无法继续在其清单为隐式广播注册广播接收器。 隐式广播是一种不专门针对该应用广播。...为了迁移到 Android 8.0 或更高版本,应用将该接收器从其清单移除。 应用将清理作业安排在设备处于空闲状态和充电时运行。 请注意:很多隐式广播当前已不受此限制所限。...应用可以继续在其清单为这些广播注册接收器,不管应用适配哪个 API 级别。 有关已豁免广播列表,请参阅隐式广播例外。...更具上面的描述,我们可以得到一下几点: 适配Android 8.0或更高版本应用无法继续在其清单为隐式广播注册广播接收器; 应用可以继续在它们清单中注册显式广播; 推荐运行时使用Context.registerReceiver

    96120

    Android8.0隐式广播和自定义签名权限

    Android官网:Oreo后台执行限制 我们这里主要看对于广播影响,摘抄一段官网上介绍: 广播限制 如果应用注册为接收广播,则在每次发送广播时,应用接收器都会消耗资源。...适配 Android 8.0 或更高版本应用无法继续在其清单为隐式广播注册广播接收器。 隐式广播是一种不专门针对该应用广播。...为了迁移到 Android 8.0 或更高版本,应用将该接收器从其清单移除。 应用将清理作业安排在设备处于空闲状态和充电时运行。 请注意:很多隐式广播当前已不受此限制所限。...应用可以继续在其清单为这些广播注册接收器,不管应用适配哪个 API 级别。 有关已豁免广播列表,请参阅隐式广播例外。...更具上面的描述,我们可以得到一下几点: 适配Android 8.0或更高版本应用无法继续在其清单为隐式广播注册广播接收器; 应用可以继续在它们清单中注册显式广播; 推荐运行时使用Context.registerReceiver

    1.5K00

    【中文教学视频】Android Oreo 后台进程

    后台运行重要性毋庸置疑 —— 无论是与服务器同步来获取最新内容,还是为您应用运算数据,都需要用到后台运行。然而繁杂后台运行进程也对操作系统造成了不小压力。...对此,Android Oreo 引入了全新后台运行限制,使得有些应用不能在后台任意运行。当然这并不意味着您只能在前台进行计算了,事实上替代方案有很多。...虽然之前我们也发布过相关文章,并附上了英文讲解视频,但为了让开发者们能够更为准确了解 Android Oreo 后台运行限制,我们特地带来了中文版讲解视频,之前没听清楚同学们,过来补补课吧。...Android Oreo 后台进程【中文教学视频】 相关文档 Android 8.0 行为变化 后台运行限制 隐式广播限制例外清单 定位服务限制 作业以及定时作业 JobScheduler 改进...我们期待大家 App 在新舞台上也能获得最佳表现!

    65220

    Android Oreo 常见问题 2.0 | Android 开发者 FAQ Vol.9

    在第一期 Android Oreo 8.0 开发者 FAQ ,我们为了尽快让大家快速了解 Android Oreo 新特性,以及它与之前版本 Android 区别,我们针对 Android Oreo...然而对于 Android Oreo 这样一个全新重大版本,寥寥几个问题无法代表全部开发者和用户。...近期,随着各个型号手机陆陆续续升级到 Android Oreo,我们收到了更多关于 Android Oreo 留言咨询。...A: 在 Android 8.0 ,应用图标现在已经规范成了圆形或者方形。如果该应用支持全新 “自适应图标” 功能,那么图标将会根据您设备选择一个固定展现形状。...版本修改到对应版本,接下来从 Manifest 移除广播接收器,最终依据 Android O 测试标准执行 Android O 测试。

    1.9K70

    Android 四大组件之BroadcastReceiver

    定义 BroadcastReceiver(广播接收器)即广播,是一个全局监听器。 Android 广播分为两个角色:广播发送者、广播接受者。 2....默认情况下,广播接收器运行在主线程,所以,onReceive() 方法不能执行耗时操作,否则会导致 ANR 异常。 5.2 注册广播接收器 广播接收器注册分为两种:静态注册、动态注册。...intent-filter/action ——用于指定此广播接收器将接收广播类型,本示例给出是用于接收网络状态改变时发出广播。...注意:Android 7.0版本开始,对静态注册广播做了限制,导致静态注册失效。应用无法使用清单注册隐式广播,仍然可以在运行时动态注册这些广播,并且可以使用清单注册专门针对它们显式广播。...发送广播时,指定特定广播接收器所在包名,具体是通过 intent.setPackage(packageName) 指定,这样此广播将只会发送到此包 App 内与之相匹配有效广播接收器

    1.4K10

    无法修复正在使用磁盘_硬盘无法正常弹出是什么原因

    前段时间中了N次毒,重装了N次机器,在与病毒战斗损失惨重,在此哀悼为之牺牲脑细胞和时间。 以前遇到问题总想在网上找答案,也受到了很多帮助和启发。今天也把自己心得写下来,供各位参考。...,自动启动添加msfun80.exe、msime82.exe。...3、以上两步完成病毒清理工作,接着要将“后遗症”治愈。...其次由于删除了各硬盘下autorun.inf可能会造成各硬盘双击无法打开,用一下方法修复: 右键点击某一硬盘,选择弹出菜单“打开”,进入硬盘。...点击文件菜单栏“工具=〉文件夹选项”,在弹出对话框选择“文件类型”=〉“高级”,选择“新建”: 在弹出对话框,“操作”栏填写“open”,“用于执行操作应用程序”栏填写“explorer.exe”

    1.3K10

    一文入门Android逆向

    1、环境准备 环境也分三六九等,一个好环境能让你节省大量时间和精力去投入到更有意义事情,所以Android移动安全第一步,就是配置一套无坑环境,首先是硬件配置如下: Kali-linux-2019...所以有些应用是基于ARM架构编译无法安装,出现如下提示: ?...4、Broadcast Receiver 你应用可以使用它对外部事件进行过滤,只对感兴趣外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。...广播接收者注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。 动态注册广播接收器特点是当用来注册Activity关掉后,广播也就失效了。...静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着。也就是说哪怕app本身未启动,该app订阅广播在触发时也会对它起作用。

    3.1K10

    Android 13 SDK更新内容

    使用JobScheduler 改进预提取作业处理:在 Android 13 ,系统现在会尝试确定应用下次启动时间,并根据该估算值运行预提取作业。...AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎以自定义 Android 画布绘制行为以及过滤 View 内容。可以用着色器来实现涟漪效果,模糊,以及拉伸滚动。...更安全地导出上下文注册接收器:为了帮助提高运行时接收器安全性,Android 13 允许您指定您应用特定广播接收器是否应被导出以及是否对设备上其他应用可见。...如果导出广播接收器,其他应用将可以向您应用发送不受保护广播。此导出配置在以 Android 13 或更高版本为目标平台应用可用,有助于防止一个主要应用漏洞来源。...Android 8.1 27 Oreo Android 8.0 26 Oreo Android 7.1.1 25 Nougat Android 7.0 24 Nougat Android 6.0 23

    2.1K10

    B4A编程开发路线001_Android安卓基础

    广播接收器(Broadcast Receivers):用于接收广播。内容提供者(Content Providers): 支持在多个应用存储和读取数据,相当于数据库。...Android APP(安卓应用程序)不一定四种组件(元件)都有。如果拥有多个活动、广播接收器或者服务,我们可以使用意图(Intents)来启动各组件,建立更复杂应用程序。...3、广播接收器(Broadcast Receivers) 在 Android APP,Broadcast 是一种广泛运用在应用程序之间传输信息机制。...总之,Android可以使用广播接收器接收有兴趣广播,或者送出广播使得其他APP知道当前APP状态改变。...5、意图(Intents) 意图(Intents)是一个启动其他Android活动、服务和广播接收器异步讯息/信息(要执行某个操作抽象描述)。

    1.1K70

    Android 进程保活】应用进程拉活 ( 应用进程拉活简介 | 广播拉活 | 显示广播与隐式广播 | 全家桶拉活 )

    开始限制 , 到 Android 8.0 之后 , 基本无法进行应用拉活操作 ; 对应用进程拉活 , 不能保证 100% 成功率 , 即使拉活成功 , 拉活方案也是有很多缺陷 , 二、 广播拉活 ---...- 监听系统广播事件 , 系统在发生特定事件时 , 发出对应事件广播 ; 在 AndroidManifest.xml 静态注册 广播接收者可以接受系统发出广播 , 监听这些广播 , 然后由系统自动拉活广播接收者所在应用进程...24 ) 开始对广播进行了限制 ; Android 8.0 ( API Level 26 ) 限制更严格 , 基本就禁止了这种做法 ; 在该版本及以后版本无法在 AndroidManifest.xml...; 这些隐式广播发出来情况很特殊 , 有可能一天也发不出一条广播 , 用于拉活应用进程不太合适 ; 参考文档 : Android 官方文档 - Oreo 版本适配 : 后台执行限制 Android..., 绝大部分广播都是隐式广播 , 很少有发送广播时候把广播接收者组件名称带上 , 系统广播都是隐式广播 ; 参考文档 : Android 官方文档 - Oreo 版本适配 : 后台执行限制

    65420

    Android-浅谈广播机制,实现强制下线功能

    类似的工作机制其实很多,比如就像计算机网络通信。 为了便于进行系统级别的消息通知,Android也有自己一套类似的广播消息机制。...标准广播: 是一种完全异步执行广播,在广播发出之后,所有的广播接收器都会在同一时间接收到这条广播消息,因此他们之间没有任何先后顺序可言。这种广播效率会比较高,但同时也意味着它是无法被截断。...有序广播: 是一种同步执行广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播消息,当这个广播接收器逻辑执行完毕之后,广播才会继续传递。所以此时广播接收器是有前后顺序。...优先级别高广播接收器就可以先接收到广播消息,并且前面的广播接收器还可以截断正在传递广播,这样后面的广播接收器无法接收到广播消息了。...由于广播接收器需要弹出一个对话框来阻塞用户正常操作,但如果创建是一个静态注册广播接收器,是没有办法在 onReceive() 方法里弹出对话框这样UI操作,而我没问显然也不可能在每个活动中都去注册一个动态广播接收器

    90430

    Broadcasts详解「建议收藏」

    一般来说,广播可以作为应用程序间、正常用户流之外消息传递系统。 系统广播 当各种系统事件发生时,系统会自动发送广播,例如系统进入/退出飞行模式。系统广播被发送给所有注册该广播接收器应用程序。...完整系统广播Action清单,请查看Android SDKBROADCAST_ACTIONS.TXT文件。每个广播Action都有一个与之相关联常量字段。...例如,当一个进程正在运行一个广播接收器(即执行onReceive()方法代码),那么它被认为是一个前台进程,它会保持正常运行,除开系统有极端内存压力。...为了避免这种情况,如果你想用更多时间在后台线程处理广播,那么你应该调用goAsync()或JobService来让系统知道进程要继续执行一些工作。...然而,即使采用这种方法,系统也希望您能在10秒内完成广播。它允许你把工作移动到另一个线程,避免阻塞主线程。 b、 用JobScheduler设置一个任务。

    81210

    Android基础总结(4)——广播接收器

    Android每个应用程序可以对自己感兴趣广播进行注册,这样该程序就只会接收自己所关心广播内容,这些广播可能来自于系统,也可能来自于其他应用程序。...所以此时广播接收器是有顺序,优先级高广播接收器可以先接受到广播消息,并且前面的广播接收器还可以截断正在传递广播,这样后面的广播接收器无法收到广播消息了。...2、广播接收器使用方法   Android系统内置了很多系统级别的广播,我们可以在应用程序通过监听这些广播来得到各种系统状态信息。...5、在广播接收器启动活动   在广播接收器也可以启动一个活动,但是我们启动活动之前必须给intent加入FLAG_ACTIVITY_NEW_TASK标志,否则将无法启动。...,保证在广播接收器可以正常弹出 22 alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

    1K100

    安卓应用安全指南 4.2.3 创建使用广播接收器 高级话题

    图 4.2-4 是一个正常行为例子,隐式意图只能在同一个应用调用私有接收器(应用 A)。 意图过滤器(在图中,action ="X")仅在应用 A 定义,所以这是预期行为。...应用只有在第一次启动后才能接收广播;因此,安装后无法使用接收广播作为启动操作触发器。...请注意,粘性广播Android 5.0(API Level 21)已弃用。...因此,当不需要粘性广播时,需要显式调用removeStickyBroadcast()来删除粘滞广播。 此外,带有特定权限受限广播接收器无法接收广播。...与粘性广播相同,它不能仅仅允许带有特定权限广播接收器接收广播。 从广播特性行为角度来看,上表反过来排列在下面的表

    1K10

    安卓开发_深入理解广播机制

    一、Broadcast(广播) 在Android,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应处理。...原因如下: (1)广播接收器生命周期是非常短暂,当广播接收器接收到广播时开始创建,而执行完onReceive(context,intent)方法后就销毁 (2)默认情况下,广播接收器也是运行在UI线程...当然,即使系统给所有的广播一开始都默认了FLAG值为:FLAG_EXCLUDE_STOPPED_PACKAGES (不发送给已经停止应用程序广播接收器) 导致已经退出应用程序无法接收到系统广播          ...81 String TIME_TICK_ACTION 广播:当前时间已经变化(正常时间流逝)。...后两个广播接收器无法再接受此广播了 4、粘性广播(查了下子类,粘性广播已被放弃,过时) 粘性广播特点为: 会一直保留到广播事件结束,没有所谓10秒限制 但是当接收此广播广播接收器onReceive

    1.5K70
    领券