Wie funktioniert der Alarm Manager, wenn sich Android 6.0 im Doze-Modus befindet?
Ich bin Entwickler von zwei Wecker-Apps bei Google Play. Ich versuche, sie mit Android 6.0 zum Laufen zu bringen. Im Doze-Modus klingelt es jedoch nicht. Ich habe sie auf die Whitelist gesetzt, ich habe ein Benachrichtigungssymbol für den Vordergrund angezeigt, ich bin nicht sicher, was ich sonst noch tun kann - im Dösen-Modus werden die Alarme des Alarm-Managers immer noch ignoriert. Die Uhr-App (bei der es sich nicht um eine AOSP-App, sondern um eine Google Play-App handelt) ist jedoch anders. Wenn der Alarm in der Clock-App aktiviert ist, lautet "adb deviceidle step" immer "active" und niemals "idle", "idle_pending" oder etwas anderes.
Ist Android hier betrogen und gibt seiner eigenen App mehr Power, auch bekannt als. "einen Apfel ziehen"? Werden alle Wecker-Apps auf Google Play funktionsunfähig? Ein bisschen beunruhigt, das sind hochwertige Apps, die jeweils ein Jahr Teilzeit-Entwicklungszeit in Anspruch genommen haben und für mich eine große Einnahmequelle darstellen. Alle Hinweise, wie ich diese zum Laufen bringen könnte, wären eine große Hilfe.
Einstellen der AlarmManager-Absicht:
Intent intent = new Intent(context, ReceiverAlarm.class);
if (android.os.Build.VERSION.SDK_INT >= 16) {
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
}
amSender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); //FLAG_CANCEL_CURRENT seems to be required to prevent a bug where the intent doesn't fire after app reinstall in KitKat
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, scheduleToTime+1, amSender);
und die ReceiverAlarm-Klasse:
public class ReceiverAlarm extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (wakeLock == null) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle);
wakeLock.acquire();
}
X.alarmMaster.startRingingAlarm(true);
}
und die relevanten Teile der X.alarmMaster.startRingingAlarm () -Methode:
if (wakeLock == null) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle);
wakeLock.acquire();
}
if (screenWakeLock == null) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
screenWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, Theme.appTitle+" scr");
screenWakeLock.acquire();
}
Intent alarmIntent = new Intent(Intent.ACTION_VIEW);
alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
alarmIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
alarmIntent.setClass(context, ActivityAlarmAlarm.class);
context.startActivity(alarmIntent);
inige der Methoden wurden zur leichteren Lesbarkeit inline eingefüg