2010-08-10 6 views
9

Je souhaite utiliser une alarme pour exécuter du code à un moment donné. J'ai réussi à mettre en place une alarme avec le récepteur de diffusion enregistré dans le manifeste mais de la façon dont je le comprends, cette méthode utilise une classe distincte pour le récepteur de diffusion.Android Alarm Manager avec récepteur de diffusion enregistré dans le code plutôt que dans le manifeste

Je peux utiliser cette méthode pour démarrer une autre activité mais je ne peux pas l'utiliser pour exécuter une méthode dans mon activité principale?

(how can I notify a running activity from a broadcast receiver?)

donc j'ai essayé d'enregistrer mon récepteur de radiodiffusion dans mon activité principale comme expliqué dans la réponse ci-dessus.

private BroadcastReceiver receiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show(); 
     uploadDB();   
    } 
};  

public void onResume() { 
    super.onResume(); 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(null); 

    this.registerReceiver(this.receiver, filter); 
} 

public void onPause() { 
    super.onPause(); 

    this.unregisterReceiver(this.receiver); 
} 

Cependant, je suis incapable d'obtenir ce à travailler avec le gestionnaire d'alarme, je ne suis pas sûr de savoir comment je dois relier l'intention d'alarme au récepteur de radiodiffusion. Quelqu'un pourrait-il me signaler un exemple d'enregistrement dynamique d'un récepteur de diffusion de gestionnaire d'alarme dans l'activité? Ou expliquer comment je ferais cela?

Répondre

15

Que pensez-vous de cela?

Intent startIntent = new Intent("WhatEverYouWant"); 
PendingIntent startPIntent = PendingIntent.getBroadcast(context, 0, startIntent, 0); 
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
alarm.set(AlarmManager.RTC_WAKEUP, triggerTime, startPIntent); 

Et puis dans votre fichier Manifest.xml:

<receiver android:name="com.package.YourOnReceiver"> 
    <intent-filter> 
     <action android:name="WhatEverYouWant" /> 
    </intent-filter> 
</receiver> 

Pour autant que je sais que vous avez encore à déclarer le récepteur dans le manifeste. Je ne suis pas sûr si vous pouvez le définir à une instance privée dans votre activité. Vous pouvez déclarer un onReceive à l'intérieur de votre activité et l'appeler (si le BroadcastReceiver a une interface, je ne sais pas si c'est le cas.)

+2

Génial, j'ai réussi à le faire fonctionner, mais je n'ai pas besoin d'ajouter du code au manifeste. Juste enregistré le récepteur de diffusion progamatically avec un intentfilter du même nom. – serenskye

+0

Merci et +1 pour vous – Barrier

1

Démarrez une intention d'alarme à partir de l'endroit où vous voulez lancer l'alarme. écrivez ci-dessous le code d'où vous voulez commencer à écouter l'alarme

Intent myIntent = new Intent(getBaseContext(), **AlarmReceiver**.class); 
       PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), 0, myIntent, 0); 
       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
       Calendar calendar = Calendar.getInstance(); 
       calendar.setTimeInMillis(System.currentTimeMillis()); 
       calendar.add(Calendar.MINUTE, shpref.getInt("timeoutint", 30)); 
       alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

Et dans le récepteur de diffusion écrivez le code que vous voulez recevoir. Et dans Manifest écrire ci-dessous

<receiver android:name=".AlarmReceiver" android:process=":remote"/> 

Vous pouvez également mettre l'alarme répétitive aussi. J'espère que ça aide!

Questions connexes