2017-04-04 4 views
2

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?

Antwort

0

AlarmManager.setRepeating funktioniert nicht ordnungsgemäß auf verschiedenen Android-Versionen.

Versuchen Sie setExact. Es wird nicht wiederholen, aber Sie können sich wiederholende Funktionalität erreichen, wie unten erwähnt:

Aktualisiert AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     context.sendBroadcast(new Intent("SERVICE_TEMPORARY_STOPPED")); 

     long repeatCount = PreferenceManager.getDefaultSharedPreferences(context).getLong("REPEAT_COUNT", 0L); 

     repeatCount++; 

     PreferenceManager.getDefaultSharedPreferences (context).edit().putLong("REPEAT_COUNT", repeatCount).apply() 

     AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

     Intent alarmIntent = new Intent(this, AlarmReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0); 
     manager.setExact(AlarmManager.RTC_WAKEUP, (repeatCount *System.currentTimeMillis()),pendingIntent); 
    } 
} 

Hier halten wir eine repeat & Variable (Präferenz basiert) und erhöhen Sie es in Ihrem AlarmReceiver & Planen Sie den Alarm erneut, indem Sie nextAlarmTime mit repeatCount * System.currentTimeMillis();