2017-10-18 7 views
-1

J'ai essayé de trouver ici le problème, mais je ne peux pas sembler ... mon OnReceive ne semble pas s'appeler, voici ce que j'ai:L'instance BroadcastReceiver enregistrée dynamiquement ne se déclenche pas?

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

Avec un peu de débogage, je vérifié que scheduleChecking est appelé mais que la méthode onReceive n'est pas appelée. J'ai aussi essayé de déclencher ce code à partir d'un shell, en utilisant:

adb shell am broadcast -a rsg.ms.7 

(où Constants.ALARM_NO_LOC_UPDATES est "rsg.ms.7").

Pouvez-vous me dire quoi changer ainsi onReceive s'appelle?

Répondre

0

Utilisation du contexte d'application au lieu du passé dans un contexte de service semble le faire fonctionner, ne sais pas pourquoi:

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

La nature de PendingIntent est lié à relativement ApplicationContext. par exemple son utilisation avec Widgets où la diffusion est en dehors de l'application. Ainsi, lorsque vous recevez une diffusion de PendingIntent dans PendingIntent.getBroadcast, vous devez fournir le contexte de l'application et non les couches inférieures. J'ai eu le même problème une fois et il m'a fallu une journée entière pour comprendre cela.