2016-08-09 101 views
2

Mein Alarm wird beendet, wenn das Betriebssystem die App beendet. Ich dachte, das wäre einer der Punkte eines Alarms, dass es weiterlaufen würde, obwohl OS die App getötet hat? Ich überprüfe die Lebensdauer des Alarms mit dem Befehl "./adb shell dumpsys alarm", und jedes Mal, wenn das Betriebssystem meine App tötet, ist auch der Alarm verschwunden. Wie ich meinen Alarm starten:Der Alarm wird beendet, wenn das Betriebssystem die App beendet

public static void startLocationAlarm(Context context){ 
    if(ActivityLifecycleHandler.isApplicationInForeground()) { 
     return; // If App is in foreground do not start alarm! 
    } 

    String alarm = Context.ALARM_SERVICE; 
    AlarmManager am = (AlarmManager) context.getSystemService(alarm); 

    Intent intent = new Intent(locationBroadcastAction); 
    PendingIntent pi = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, 0); 

    int type = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
    long interval = ONE_MINUTE; 
    long triggerTime = SystemClock.elapsedRealtime() + interval; 

    am.setRepeating(type, triggerTime, ONE_MINUTE, pi);  
} 

etwas mehr Kontext hinzuzufügen, ich versuche, in einem Dienst eine Stelle Betrieb tun (nicht IntentService) im Hintergrund. Hier ist mein Empfänger. Benutzte Wakeful, weil ich nicht wollte, dass der Dienst getötet wurde, bevor es fertig war.

public class LocationBroadcastReceiver extends WakefulBroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent myIntent = new Intent(context, LocationServiceAlarmOwnGoogleClient.class); 
    //context.startW(myIntent); 
    LocationBroadcastReceiver.startWakefulService(context, myIntent); 
} 
} 

Für einige weitere Informationen: kündige ich den Alarm in OnStart Methode von mehreren Aktivitäten, die der Benutzer zurückkehren kann es im Hintergrund, nachdem sie. Ich weiß nicht, ob das dieses seltsame Verhalten verursachen kann? Hier ist meine Abbrechen Methode:

public static void stopLocationAlarm(Context context){ 
    Intent intent = new Intent(locationBroadcastAction); 
    PendingIntent sender = PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
    alarmManager.cancel(sender); 
} 
+0

Das ist das Standardverhalten – Shaishav

+0

"jedes Mal, wenn OS meine App tötet, ist der Alarm auch weg" - bitte erklären Sie im Detail, was Sie mit "OS kills my app" meinen. – CommonsWare

+0

@Shaishav Aaah, okey. Ich dachte, Alarme sollten weiterleben, obwohl die App von OS getötet wurde. Wie kann ich dafür sorgen, dass es weiterlebt, obwohl das Betriebssystem es tötet? – Slagathor

Antwort

0

Sie Service hinzufügen können, die an das Telefon des Einschaltens Rückruf hört. fügen diese Erlaubnis in den manifesten

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

und registrieren reciever

<receiver android:name=".util.notification.local.MyBootCompletedService"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
</receiver> 

public class MyBootCompletedService extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     AlarmReceiver.startLocalNotificationService(context); 
    } 
} 
+0

Hi! Danke für die Antwort! Aber ich möchte nicht, dass der Alarm oder der Dienst beim Hochfahren ausgeführt wird. Nur wenn die Benutzer meine App bereits geöffnet haben und sie dann in den Hintergrund stellen, möchte ich, dass der Alarm ausgeführt wird, der einen Dienst auslöst. – Slagathor

0

Der Fehler, der den Alarm ausgelöst hatte eigentlich nichts mit dem Code zu tun abgesagt werden, hatte aber mit speziellen Batterieeinstellungen zu tun auf Huawei-Geräten. Wenn Ihre App in "geschützte Apps" nicht als "geschützt" festgelegt ist, wird das System den Alarm abbrechen, wenn die App beendet wird. Wenn Sie Ihre App "geschützten Apps" hinzufügen, wird dieses Problem gelöst. Gleiches gilt für Xiaomi-Geräte. Müssen sie zu "Geschützte Apps" hinzufügen, dann wird der Alarm wie vorgesehen funktionieren. Danke @CommonsWare, dass Sie mich zur Lösung geführt haben.