Android 动态注册的BroadcastReceiver实例未触发?

Android 动态注册的BroadcastReceiver实例未触发?,android,broadcastreceiver,Android,Broadcastreceiver,我一直在试图找出问题所在,但我似乎无法。。。我的onReceive似乎没有接到电话,以下是我的情况: public abstract class NoUpdatesTimer extends BroadcastReceiver { private Context context; private PendingIntent pendingIntent; public NoUpdatesTimer(Context context) { this.conte

我一直在试图找出问题所在,但我似乎无法。。。我的onReceive似乎没有接到电话,以下是我的情况:

public abstract class NoUpdatesTimer extends BroadcastReceiver {
    private Context context;
    private PendingIntent pendingIntent;

    public NoUpdatesTimer(Context context) {
        this.context = context;
        Intent intent = new Intent(Constants.ALARM_NO_LOC_UPDATES);
        pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        context.registerReceiver(this, new IntentFilter(Constants.ALARM_NO_LOC_UPDATES));
    }

    public void scheduleCheck(long delayMillis) {
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delayMillis, pendingIntent);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}
通过一些调试,我验证了scheduleChecking被调用,但onReceive方法没有被调用。我还尝试使用以下命令从shell触发此代码:

adb shell am broadcast -a rsg.ms.7
(其中常量报警号位置更新为“rsg.ms.7”)


您能告诉我如何更改以调用onReceive吗?

使用应用程序上下文而不是传入的服务上下文似乎可以使其工作,但不确定原因:

public abstract class NoUpdatesTimer extends BroadcastReceiver {
    private Context context;
    private PendingIntent pendingIntent;

    public NoUpdatesTimer(Context context) {
        this.context = context.getApplicationContext();
        Intent intent = new Intent(Constants.ALARM_NO_LOC_UPDATES);
        pendingIntent = PendingIntent.getBroadcast(this.context, 0, intent, 0);
        this.context.registerReceiver(this, new IntentFilter(Constants.ALARM_NO_LOC_UPDATES));
    }

    public void scheduleCheck(long delayMillis) {
        AlarmManager alarmManager = (AlarmManager)this.context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + delayMillis, pendingIntent);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ...
    }
}

pendingent
的性质与
ApplicationContext
相关。 例如,当广播在应用程序之外时,它与小部件一起使用。 因此,当您从
pendingent.getBroadcast
中的
pendingent
获取广播时,您必须提供应用程序上下文,而不是较低的层。 我曾经有过同样的问题,我花了一整天的时间才弄明白