2017-10-18 114 views
-1

我一直在试图发现这里的问题,但我似乎无法...我的onReceive似乎并没有被调用,这是我有:动态注册的BroadcastReceiver实例不会触发?

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方法未被调用。我还试图从一个壳触发此代码,用:

adb shell am broadcast -a rsg.ms.7 

(其中Constants.ALARM_NO_LOC_UPDATES是 “rsg.ms.7”)。

你能告诉我该怎么改变,所以接受被称为?

回答

0

使用的,而不是在服务上下文通过应用程序上下文似乎使其工作,不知道为什么:

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) { 
     ... 
    } 
} 
0

PendingIntent性质势必相对要ApplicationContext。例如 ,例如,其广播在应用程序之外的小部件的使用。 所以当你从PendingIntentPendingIntent.getBroadcast得到广播时,你不得不提供应用程序上下文而不是下层。 我曾经有过同样的问题,花了我整整一天的时间才弄清楚。