Erstens, anstatt direkt einen Dienst in der AlarmManager
Anruf einen Broadcast-Empfänger anzurufen, der dann den Dienst anruft.
Der Broadcast-Empfänger sollte eine WakefulBroadcastReceiver
anstelle einer regulären BroadcastReceiver
verlängern.
Und dann lassen Sie den Rundfunkempfänger einen neuen Alarm planen, starten Sie den Dienst mit startWakefulService()
statt startService()
public class MyAwesomeReceiver extends WakefulBroadcastReceiver {
int interval=2*60*60*1000;
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, MyAwesomeService.class);
Intent receiverIntent = new Intent(context, MyAwesomeReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 11, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+interval,alarmIntent);
startWakefulService(context, serviceIntent);
}
}
Die WakefulBroadcastReceiver
und startWakefulService()
wird Ihre App ein 10 Sekunden-Fenster lassen tun zu lassen, was es braucht, um machen.
Auch
Sie immer den Benutzer fragen, können Sie Ihre App ignorieren Batterie Optimierung Funktionalität using-
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
if (powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
}
else {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
und im Manifest
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"></uses-permission>
zu lassen, dass auch in Ordnung, wenn nicht tun von Google Play genehmigt ist FCM-Nachricht mit hoher Priorität, wie lange das Gerät von Doze aufwachen kann? Ich habe das implementiert. Ist der obige Code von der App-Liste? Wie kann ich das bestätigen? – Sri
@srikanth fragt der Code zur Laufzeit nach 'ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS'. Wenn du hier liest: https://developer.android.com/training/monitoring-device-state/doze-standby.html#support_for_other_use_cases wirst du sehen, dass ihre Dokumente sagen, dass du wieder Zugang zu partiellen Wakelocks erhältst, die deine App war fehlt – mehulmpt
Es funktioniert nicht auch. :( – Sri