2016-08-14 3 views
1

Selon this article, si je dois mettre en œuvre automatique supprime certaines lignes (de plus de l'heure) de ma base de données que lorsque certaines activités est ouvert, je dois utiliser ResultReceiver:Comment utiliser Resultreceiver et AlarmManager ensemble?

ResultReceiver - Interface de rappel générique pour l'envoi résultats entre service et activité. Si votre service a seulement besoin de se connecter avec son application parente dans un seul endroit, utilisez cette approche.

et AlarmManager:

Trigger à un moment précis dans l'avenir ou à un intervalle récurrent

Mais je faisais face avec le problème que je ne sais pas comment utiliser AlarmManager avec ResultReceiver. Je veux dire que je ne comprends pas comment appeler mon IntentService de l'activité.

Dans mon service intention j'ai quelque chose comme ça:

@Override 
    protected void onHandleIntent(Intent intent) { 
     Log.d(LOG_TAG, "Inside onHandleIntent"); 
     ResultReceiver rec = intent.getParcelableExtra(IntentConstants.UPDATE_REMINDERS_SERVICE_RECEIVER); 
     int rowsDeleted = notificationService.deleteAllOld(Calendar.getInstance().getTimeInMillis()); 

     Bundle bundle = new Bundle(); 
     bundle.putString(IntentConstants.UPDATE_REMINDERS_SERVICE_NOTIFICATIONS_DELETED, "Rows deleted: " + rowsDeleted); 
     // Here we call send passing a resultCode and the bundle of extras 
     rec.send(Activity.RESULT_OK, bundle); 

    } 

Et en activité:

// Starts the IntentService 
    public void onStartService() { 
     Log.d("UpdateRemindersLog", "Inside onStartService"); 
     final Intent i = new Intent(this, UpdateRemindersService.class); 
     i.putExtra(IntentConstants.UPDATE_REMINDERS_SERVICE_RECEIVER, remindersReceiver); 
     startService(i); 
    } 

J'ai essayé de mettre en œuvre à l'intérieur AlarmManager méthode onStartService mais il ne fonctionne pas. Je pensais que ça va être comme ceci:

Intent intent = new Intent(getApplicationContext(), UpdateRemindersReceiver.class); 
intent.putExtra(IntentConstants.UPDATE_REMINDERS_SERVICE_RECEIVER, remindersReceiver); 
// Create a PendingIntent to be triggered when the alarm goes off 
final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, UpdateRemindersService.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

long firstMillis = System.currentTimeMillis(); // alarm is set right away 
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 10*1000, pendingIntent); 

Alors, quelqu'un peut me expliquer comment je peux mettre en œuvre AlarmManager avec IntentService? Merci.

Répondre

0

La cible de l'appel PendingIntent.getBroadcast() doit être un récepteur de diffusion, comme le suggère la méthode. Le AlarmManager ne fonctionne qu'avec Intent s pour ceux-ci.

Vous avez donc besoin d'ajouter un récepteur de radiodiffusion qui gère le signal du AlarmManager puis commence votre service:

public class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Start your service here 
    } 
} 

De plus, souvenez-vous d'enregistrer votre récepteur dans votre présent (comme fichier AndroidManifest.xml dans votre application tag):

<receiver 
    android:name=".AlarmReceiver" 
    android:enabled="true" /> 

Et lorsque vous créez votre Intent vous devriez maintenant cibler votre nouvelle classe de récepteur (AlarmReceiver.class).

+0

Je viens de découvrir qu'IntentService et AlarmManager sont tous deux des "lanceurs". Donc, mon code était stupide comme l'enfer. Mais l'homme d'aide de toute façon! –