Ich arbeite derzeit mit Android Alarm Manager und fand ein funktionierendes Beispiel. Aber es funktioniert nicht richtig in meiner Situation. Lassen Sie mich erklären. Grundsätzlich ist es mein Ziel, alle 5 Minuten eine Methode aus der MainActivity auszuführen. Zu diesem Zweck verwende ich den Alarm Manager, um diese Aufgabe zu planen.Alarm Manager funktioniert nicht wie erwartet, wenn Task
Im Grunde ist dies die Arbeits Zeug:
AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.sendBroadcast(new Intent("SERVICE_TEMPORARY_STOPPED"));
}
}
MainActivity.java
public class MainActivity extends Activity{
private PendingIntent pendingIntent;
private AlarmManager manager;
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
registerReceiver(broadcastReceiver, new IntentFilter("SERVICE_TEMPORARY_STOPPED"));
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startAlarm();
}
});
}
public void startAlarm() {
manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
int interval = 300000;
manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
Log.d(TAG, "Alarm Set");
}
}
Alles ist gut. "Ich renne" Toast wird alle 300000 ms (5 Minuten) ausgeführt. Die Klasse AlarmReceiver
sendet eine Broadcast-Nachricht an meine Hauptaktivität mit der Nachricht "SERVICE_TEMPORARY_STOPPED". Ich habe diese Nachricht bereits in meiner MainActivity über registerReceiver(broadcastReceiver, new IntentFilter("SERVICE_TEMPORARY_STOPPED"));
registriert. Aber, wenn ich eine andere Methode, sagen wir stopAlarm()
in BroadcastReceiver hinzufügen, die den Alarm nach 5 Minuten stoppen wird, wird das Zeitintervall (5 Minuten) nicht mehr angewendet. In etwa 10 Sekunden ruft er den Broadcast Receiver an und stoppt den Alarm. Und das ist das Problem. Werfen Sie einen Blick auf die stop()
Methode und wie ich nenne es auf dem broadcastReceiver
:
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show();
stopAlarm();
}
};
public void stopAlarm() {
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
Log.d(TAG, "Alarm Cancelled");
}
Jeder Hinweis?