2017-10-18 18 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" である):私も使用して、シェルからこのコードをトリガすることを試みました。

変更する必要があることを教えてください.Receiveが呼び出されますか?

答えて

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にバインドされています。 たとえば、ブロードキャストがアプリケーションの外部にあるウィジェットでの使用。 PendingIntentからPendingIntent.getBroadcastにブロードキャストするときは、下位層ではなくアプリケーションのコンテキストを指定する必要があります。 私は一度同じ問題を抱えていましたが、これを理解するまでには一日かかりました。

関連する問題