如何使报警管理器工作时Android 6.0在打盹模式?

我是Google Play上的两个闹钟应用的开发者。我试图让他们使用Android 6.0。但是,打盹模式使得它们不振铃。我把它们放在白名单上,我把一个前台通知图标向上,我不知道还能做什么 – 在打盹模式下,报警管理器报警仍然被忽略。但是,时钟应用程序(这是一个Google Play而不是AOSP应用程序)是不同的。当闹钟在时钟应用程序上启用时,“adb deviceidle step”将始终读为“活动”,从不“空闲”,“idle_pending”或任何其他。

Android在这里做作弊,给自己的应用程序更多的权力,又名。 “拉苹果”? Google Play上的所有闹钟应用程式即将失效吗?这里的担心,这些都是高品质的应用程序,每个花了一年的兼职开发时间,是我的大收入来源。任何线索,如何我可以让这些工作将是一个巨大的帮助。

设置AlarmManager意向:

        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);

和ReceiverAlarm类:

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);
}

以及X.alarmMaster.startRingingAlarm()方法的相关部分:

    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);

为了更容易阅读,一些方法被内联粘贴。

Doze和App Standby确实改变了关于报警和唤醒锁的行为,但它们绝对不是你的世界的尽头!

你尝试使用方法setAlarmclock()而不是set()?
它是专为闹钟设计的,可以通过打盹。有几个adb命令可以用来手动将手机置于打盹或应用程序待机模式:https://developer.android.com/preview/features/power-mgmt.html

如果这不能唤醒你的应用程序,有确定火的方法setExactAndAllowWhileIdle()旨在唤醒电话从打盹无论什么。最糟糕的情况下,您可以使用此方法唤醒您的应用程序,并使用唤醒计划下一个报警。

另一个值得读的页面是这个博客文章,其背景工作和报警的流程图:https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo

让我知道这如何为你工作!

http://stackoverflow.com/questions/32492770/how-to-make-alarm-manager-work-when-android-6-0-in-doze-mode

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何使报警管理器工作时Android 6.0在打盹模式?