2017-10-18 106 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得到廣播時,你不得不提供應用程序上下文而不是下層。 我曾經有過同樣的問題,花了我整整一天的時間才弄清楚。

相關問題