为啥动态注册的BroadCastReceiver在其进程死亡后无法接收广播?

Posted

技术标签:

【中文标题】为啥动态注册的BroadCastReceiver在其进程死亡后无法接收广播?【英文标题】:Dynamically registered BroadCastReceiver cannot Receive Broadcasts after its process is died why?为什么动态注册的BroadCastReceiver在其进程死亡后无法接收广播? 【发布时间】:2015-11-11 01:10:31 【问题描述】:

我正在创建与服务器同步数据的小部件应用程序我正在动态注册 BroadCastReceiver 以接收 SCREEN_ONSCREEN_OFF 广播我在扩展应用程序的类中注册了我的 BroadCastReceiver,但问题是如果进程正在运行它,应用程序会收到 SCREEN_ON SCREEN_OFF 广播,但如果进程终止,那么应用程序将无法接收广播,为什么?在 BroadCastReceiver 理论中,他们说应用即使没有运行也会接收广播。

public class ThisApplication extends Application 

    @Override
    public void onCreate() 
        super.onCreate();
        Utils.logCat("ThisApplication", "onCreate()");
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(new ScreenOnOffReceiver(), intentFilter);
    


public class ScreenOnOffReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 
        if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
             Utils.logCat("Screen ScreenOnOffReceiver", "SCREEN is ON");
        
        else
        
             Utils.logCat("Screen ScreenOnOffReceiver", "SCREEN is OFF");     
        
    

【问题讨论】:

尝试从服务中注册广播接收器 @MitchDart 接收 SCREEN_ON SCREEN_OFF 广播的接收器应按照文档所述动态注册 [link]developer.android.com/reference/android/content/… @RajeshJadav 我现在正在做这个谢谢我会在解决问题时给你反馈 【参考方案1】:

1 - 您忘记将上下文添加到您的 new ScreenOnOffReceiver() 将其更改为new ScreenOnOffReceiver(this)

2 - 我猜你有一个包含unregisterReceiver()onPause(); 方法?

这可确保当您的应用关闭时,BroadcastReceiver 也会关闭或取消注册。因此,最好直接使用清单文件注册您的接收器。如果由于某种原因您必须动态注册它: 使用if 语句检查您的接收器是否正在收听。如果是,请不要创建另一个。如果不是创建一个。如果您想知道如何(代码)在下面发表评论,我会这样做)

【讨论】:

@Shan Ali 如果您发布完整代码,这将很有用。或者至少如果你有 onPause() / onResume() 方法 我没有实现 onPause/onResume 因为我在应用程序上下文中工作,这些方法在那里不可用 @ShanAli 能否请您发布您的源代码或至少说明您为什么不希望直接在清单中注册您的接收器。?【参考方案2】:AndroidManifest.xml注册的BroadcastReceiver即使进程没有运行也会收到广播 在运行时注册的BroadcastReceiver 仅在 VM 运行时存在,并且在进程死亡时不会被调用。

那是规则,那是缩进的行为,一直都是这样,你无法改变。

说:

如果你想要一个,你可以在运行时启用/禁用在清单中注册的BroadcastReceiver,就像这个答案一样:

Enable and disable a Broadcast Receiver

【讨论】:

以上是关于为啥动态注册的BroadCastReceiver在其进程死亡后无法接收广播?的主要内容,如果未能解决你的问题,请参考以下文章

BroadcastReceiver的onReceive方法是否会在动态注册时被调用?

Android基础篇 静态注册 and 动态注册 BroadcastReceiver系列

Android中BroadcastReceiver的两种注册方式(静态和动态)详解

BroadcastReceiver的使用,动态注册和注销,优先级和中断控制

BroadcastReceiver源码解析

BroadcastReceiver源码解析