2016-08-14 4 views
1

Nach this article, wenn ich den automatischen Löschen bestimmte Zeilen (älter als aktuelle Zeit) implementieren, muß aus meiner Datenbank nur dann, wenn bestimmte Aktivität offen ist, ich habe ResultReceiver verwenden:Wie werden ResultReceiver und AlarmManager zusammen verwendet?

ResultReceiver - Generic Callback-Schnittstelle für das Senden Ergebnisse zwischen Service und Aktivität. Wenn sich Ihr Dienst nur an einer zentralen Stelle mit der übergeordneten Anwendung verbinden muss, verwenden Sie diesen Ansatz.

und Alarmmanager:

Auslöser zu einem bestimmten Zeitpunkt in der Zukunft oder in einem wiederkehrenden Intervall

Aber ich konfrontierte mit Problem, dass ich weiß nicht, wie Alarmmanager mit ResultReceiver zu verwenden. Ich meine, ich verstehe nicht, wie ich meinen IntentService von Activity aus aufrufen soll.

In meinem Intent Service Ich habe so etwas wie das:

@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); 

    } 

Und Aktivität:

// 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); 
    } 

Ich habe versucht Alarmmanager innerhalb onStartService Methode zu implementieren, aber es funktioniert nicht. Ich dachte, es wird so sein:

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); 

So kann jemand mir erklären, wie ich mit Alarmmanager IntentService umsetzen können? Danke.

Antwort

0

Das Ziel des Aufrufs PendingIntent.getBroadcast() muss ein Broadcast-Empfänger sein, wie die Methode vorschlägt. Die AlarmManager funktioniert nur mit Intent s für diese.

So benötigen Sie einen Rundfunkempfänger hinzufügen, die die AlarmManager ‚s-Signal behandelt und dann beginnt Ihr Service:

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

Denken Sie auch daran Ihre Empfänger in Ihrer AndroidManifest.xml-Datei zu registrieren, wie folgt aus (in Ihrem application Tag):

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

Und wenn Sie erstellen Ihre Intent Sie nun Ihre neue Receiver-Klasse (AlarmReceiver.class) zielen sollte.

+0

Ich habe gerade herausgefunden, dass IntentService und AlarmManager beide "Launcher" sind. Also mein Code war dumm wie die Hölle. Aber thx Mann um Hilfe auf jeden Fall! –

Verwandte Themen