Como fazer o Alarm Manager funcionar no Android 6.0 no modo Doze?

Sou desenvolvedor de dois aplicativos de despertador no Google Play. Estou tentando fazê-los funcionar com o Android 6.0. No entanto, o modo Doze faz com que eles não toquem. Coloquei-os na lista branca, coloquei um ícone de notificação em primeiro plano, não sei o que mais posso fazer - quando no modo Doze, os alarmes do Alarm Manager ainda são ignorados. O aplicativo Clock (que é um aplicativo do Google Play e não do AOSP), no entanto, é diferente. Quando o alarme é ativado no aplicativo Relógio, "adb deviceidle step" sempre lê "active" e nunca "inativo", "idle_pending" ou qualquer outra coisa.

O Android está trapaceando aqui, dando mais poder ao seu próprio aplicativo, também conhecido como. "puxando uma maçã"? Todos os aplicativos de despertador no Google Play estão prestes a se tornar não funcionais? Meio que preocupados aqui, esses são aplicativos de qualidade que cada um levou um ano em tempo parcial de desenvolvimento e são grandes fontes de renda para mim. Qualquer pista sobre como eu poderia fazê-las funcionar seria uma grande ajuda.

Definindo a intenção do 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);

e a classe 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);
}

e as partes relevantes do método 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);

Alguns dos métodos foram colados em linha para facilitar a legibilidade.

questionAnswers(2)

yourAnswerToTheQuestion