Wie kann ich einen Alarm so einstellen, dass er nach den neuesten Einschränkungen für Android genau zu einem bestimmten Zeitpunkt geplant wird?

27

Hinweis: Ich habe verschiedene Lösungen ausprobiert, über die hier in StackOverflow geschrieben wurde (Beispiel hier ). Bitte schließen Sie dies nicht, ohne zu überprüfen, ob Ihre Lösung von dem, was Sie gefunden haben, mit dem unten beschriebenen Test funktioniert.

Hintergrund

Für die App ist es erforderlich, dass der Benutzer eine Erinnerung festlegt, die zu einem bestimmten Zeitpunkt geplant werden soll. Wenn die App zu diesem Zeitpunkt ausgelöst wird, führt sie im Hintergrund etwas Winziges aus (nur eine DB-Abfrageoperation) und zeigt a einfache Benachrichtigung, um über die Erinnerung zu erzählen.

In der Vergangenheit habe ich einen einfachen Code verwendet, um etwas festzulegen, das zu einem relativ bestimmten Zeitpunkt geplant werden soll:

            val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val pendingIntent = PendingIntent.getBroadcast(context, requestId, Intent(context, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
            when {
                VERSION.SDK_INT >= VERSION_CODES.KITKAT -> alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
                else -> alarmManager.set(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
            }
class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.d("AppLog", "AlarmReceiver onReceive")
        //do something in the real app
    }
}

Verwendungszweck:

            val timeToTrigger = System.currentTimeMillis() + java.util.concurrent.TimeUnit.MINUTES.toMillis(1)
            setAlarm(this, timeToTrigger, 1)

Das Problem

Ich habe diesen Code jetzt auf Emulatoren in neuen Android-Versionen und auf Pixel 4 mit Android 10 getestet, und er scheint nicht auszulösen, oder er wird möglicherweise nach einer sehr langen Zeit seit dem, was ich ihm zur Verfügung stelle, ausgelöst. Ich bin mir des schrecklichen Verhaltens bewusst , das einige OEMs zum Entfernen von Apps aus den letzten Aufgaben hinzugefügt haben, aber dieses ist sowohl auf Emulatoren als auch auf Pixel 4-Geräten (Standard).

Ich habe in den Dokumenten über das Einstellen eines Alarms gelesen , dass er für Apps eingeschränkt wurde, damit er nicht zu oft auftritt, aber dies erklärt nicht, wie ein Alarm zu einem bestimmten Zeitpunkt eingestellt wird, und es erklärt nicht Wie kommt es, dass Googles Clock-App erfolgreich ist?

Darüber hinaus heißt es nach meinem Verständnis, dass die Einschränkungen insbesondere für den Energiesparmodus des Geräts gelten sollten. In meinem Fall hatte ich diesen Status jedoch weder auf dem Gerät noch auf den Emulatoren. Ich habe die Alarme so eingestellt, dass sie in ungefähr einer Minute ausgelöst werden.

Angesichts der Tatsache, dass viele Wecker-Apps nicht mehr wie früher funktionieren, fehlt meiner Meinung nach etwas in den Dokumenten. Ein Beispiel für solche Apps ist die beliebte Timely- App, die von Google gekauft wurde, aber nie neue Updates erhalten hat, um die neuen Einschränkungen zu erfüllen. Jetzt möchten Benutzer sie zurück. . Einige beliebte Apps funktionieren jedoch einwandfrei, wie z. B. diese .

Was ich versucht habe

Um zu testen, ob der Alarm tatsächlich funktioniert, führe ich diese Tests durch, wenn ich in einer Minute nach der ersten Installation der App versuche, den Alarm auszulösen, während das Gerät mit dem PC verbunden ist (um die Protokolle anzuzeigen):

  1. Testen Sie, ob sich die App im Vordergrund befindet und für den Benutzer sichtbar ist. - dauerte 1-2 Minuten.
  2. Der Test, wann die App in den Hintergrund gesendet wurde (z. B. über die Home-Taste), dauerte ca. 1 Minute
  3. Testen Sie, wann die Aufgabe der App aus den letzten Aufgaben entfernt wurde. - Ich habe mehr als 20 Minuten gewartet und nicht gesehen, dass der Alarm ausgelöst wurde, als ich in Protokolle schrieb.
  4. Wie # 3, aber auch den Bildschirm ausschalten. Es wäre wahrscheinlich schlimmer ...

Ich habe versucht, die nächsten Dinge zu verwenden, alle funktionieren nicht:

  1. alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)

  2. alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  3. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)

  4. Kombination einer der oben genannten, mit:

    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) alarmManager.setWindow(AlarmManager.RTC_WAKEUP, 0, 60 * 1000L, pendingIntent)

  5. Es wurde versucht, einen Dienst anstelle von BroadcastReceiver zu verwenden. Auch einen anderen Prozess ausprobiert.

  6. Ich habe versucht, die App aus der Batterieoptimierung zu ignorieren (hat nicht geholfen), aber da andere Apps sie nicht benötigen, sollte ich sie auch nicht verwenden.

  7. Versucht damit:

            if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP)
                alarmManager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingIntent), pendingIntent)
            AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, timeToTrigger, pendingIntent)
  1. Es wurde versucht, einen Dienst mit dem Auslöser onTaskRemoved zu haben , um den Alarm dort neu zu planen, aber dies hat auch nicht geholfen (der Dienst hat jedoch einwandfrei funktioniert).

In Bezug auf die Google Clock-App habe ich nichts Besonderes gesehen, außer dass eine Benachrichtigung angezeigt wird, bevor sie ausgelöst wird, und ich sehe sie auch nicht im Abschnitt "Nicht optimiert" des Bildschirms mit den Einstellungen für die Batterieoptimierung.

Sehen , dass dies wie ein Bug scheint, berichten ich dies etwa hier , darunter ein Beispielprojekt und Video , das Problem zu zeigen.

Ich habe mehrere Versionen des Emulators überprüft und es scheint, dass dieses Verhalten von API 27 (Android 8.1 - Oreo) aus gestartet wurde. Wenn ich mir die Dokumente ansehe, sehe ich nicht, dass AlarmManager erwähnt wird, sondern es wurde über verschiedene Hintergrundarbeiten geschrieben.

Die Fragen

  1. Wie stellen wir etwas ein, das heutzutage zu einem relativ genauen Zeitpunkt ausgelöst wird?

  2. Wie kommt es, dass die oben genannten Lösungen nicht mehr funktionieren? Vermisse ich etwas Genehmigung? Vielleicht soll ich stattdessen einen Arbeiter benutzen? Aber würde es dann nicht bedeuten, dass es möglicherweise nicht rechtzeitig ausgelöst wird?

  3. Wie überwindet die Google "Clock" -App all dies und wird trotzdem immer genau zur richtigen Zeit ausgelöst, selbst wenn sie erst vor einer Minute ausgelöst wurde? Ist es nur, weil es eine System-App ist? Was ist, wenn es als Benutzer-App auf einem Gerät installiert wird, auf dem es nicht integriert ist?

Wenn Sie sagen , dass es ist , weil es sich um eine System - App ist, habe ich eine andere App gefunden , die einen Alarm zweimal in 2 Minuten auslösen können, hier , obwohl ich denke , es manchmal ein Vordergrund Dienst verwenden können.

EDIT: eine winzige Github - Repository , um zu versuchen Ideen auf, machte hier .


BEARBEITEN: Endlich ein Beispiel gefunden , das sowohl Open-Source ist als auch dieses Problem nicht hat. Leider ist es sehr komplex und ich versuche immer noch herauszufinden, was es so anders macht (und welchen minimalen Code ich meinem POC hinzufügen sollte), damit die Alarme nach dem Entfernen der App aus den letzten Aufgaben geplant bleiben

Android-Entwickler
quelle
Es ist lange her, dass ich am Service gearbeitet habe (ich bin nicht einmal ein Profi-Entwickler), aber ich kann vorschlagen, dass Sie alarmManager für Fälle vermeiden, in denen der Alarm unter 5 Minuten eingestellt werden soll, da Android-Einschränkungen nach einem Zeitdienst auftreten, der im Internet ausgeführt wird Das Backend wird alle 5 Minuten oder länger und nicht weniger als 5 Minuten aufgerufen. Stattdessen habe ich Handler verwendet. Und um meinen Dienst im Hintergrund fortzusetzen, habe ich [ github.com/fabcira/neverEndingAndroidService]
Blu
Was sind die genauen Einschränkungen? Was ist die minimale Zeit, die garantiert ist, dass ein Trigger in einer relativ präzisen Zeit funktioniert?
Android-Entwickler
Ich kann mich nicht an genaue Einschränkungen erinnern, aber als ich daran arbeitete, habe ich tagelang gegoogelt, um zu verhindern, dass der Hintergrunddienst automatisch beendet wird. Und aus persönlicher Beobachtung habe ich ein Problem bei Samsung, Xiaomi usw. festgestellt. Sie können alarmManger nicht zwischen 5 Minuten anrufen. Ich habe einen Daten-Upload-Dienst mit alarmManger implementiert, der alle 1 Minute ausgelöst wird, aber er hat unseren Kunden enttäuscht, der sich über den Dienst beschwert hat läuft überhaupt nicht. Für Emulatoren funktioniert es gut.
Blu
Ich weiß, dass Sie die Aktivität in Android Q nicht über den Hintergrund starten können, aber es sieht nicht so aus, als wäre es Ihr Fall.
März
@ greeble31 Ich habe es jetzt versucht. Welche Lösung sehen Sie dort? Aus irgendeinem Grund bekomme ich es immer noch nicht zum Laufen. Ich stelle den Alarm ein, entferne die App aus den letzten Aufgaben und sehe nicht, dass der Alarm ausgelöst wird, obwohl der Bildschirm eingeschaltet und das Gerät an ein Ladegerät angeschlossen ist. Dies geschieht sowohl auf einem realen Gerät (Pixel 4 mit Android 10) als auch auf einem Emulator (z. B. API 27). Funktioniert es für dich? Können Sie bitte den vollständigen Code teilen? Vielleicht in Github?
Android-Entwickler

Antworten:

4

Wir haben nichts zu tun.

Sobald Ihre App nicht auf der Whitelist steht, wird sie immer beendet, sobald sie aus den letzten Apps entfernt wurde.

Weil Original Equipment Manufacturer (OMEs) ständig gegen die Android-Konformität verstoßen .

Wenn Ihre App nicht von der Geräteherstellung in die Whitelist aufgenommen wurde, werden keine Hintergrundarbeiten ausgelöst, auch keine Alarme - falls Ihre App aus den letzten Apps entfernt wird.

Eine Liste der Geräte mit diesem Verhalten finden Sie hier. AUCH möglicherweise finden Sie eine Nebenlösung. Sie funktioniert jedoch nicht gut.

Ibrahim Ali
quelle
Ich bin mir dieser Ausgabe chinesischer OEMs sehr wohl bewusst. Aber wie ich geschrieben habe, passiert es sogar auf Emulator und Pixel 4-Gerät. Es ist nicht irgendein chinesischer OEM, der es als solches geschafft hat. Bitte überprüfen Sie den Emulator und / oder das Pixel-Gerät. Das Problem besteht auch dort. Stellen Sie einen Alarm ein, entfernen Sie die App aus den letzten Aufgaben und stellen Sie sicher, dass der Alarm nicht ausgelöst wird. Ich sehe dies als Fehler und habe hier berichtet (es enthält ein Video und ein Beispielprojekt, wenn Sie es versuchen möchten): issuetracker.google.com/issues/149556385. Ich habe meine Frage aktualisiert, um es klar zu machen. Die Frage ist, warum eine App erfolgreich war.
Android-Entwickler
@androiddeveloper Ich glaube, es sollte auf Emulator funktionieren .. Welchen Emulator hast du?
Ibrahim Ali
Ich glaubte auch, bis ich es versuchte. Probieren Sie es einfach auf API 29 aus, um zu erfahren, was Android Studio zu bieten hat. Ich bin mir sicher, dass dies auch bei etwas älteren Versionen der Fall sein wird.
Android-Entwickler
4

Es wurde eine seltsame Problemumgehung gefunden (Beispiel hier ), die für alle Versionen zu funktionieren scheint, einschließlich sogar für Android R:

  1. Lassen Sie die Erlaubnis SAW-Erlaubnis im Manifest deklarieren:
      <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Auf Android R muss es auch gewährt werden. Vorher scheint es nicht so, als müsste es gewährt, nur deklariert werden. Ich bin mir nicht sicher, warum sich dies bei R geändert hat, aber ich kann sagen, dass SAW als mögliche Lösung erforderlich sein könnte, um Dinge im Hintergrund zu starten, wie hier für Android 10 geschrieben.

  1. Haben Sie einen Dienst, der erkennt, wann die Aufgaben entfernt wurden, und wenn dies der Fall ist, öffnen Sie eine gefälschte Aktivität, die sich nur selbst schließt:
class OnTaskRemovedDetectorService : Service() {
    override fun onBind(intent: Intent?) = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int) = START_STICKY

    override fun onTaskRemoved(rootIntent: Intent?) {
        super.onTaskRemoved(rootIntent)
        Log.e("AppLog", "onTaskRemoved")
        applicationContext.startActivity(Intent(this, FakeActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
        stopSelf()
    }

}

FakeActivity.kt

class FakeActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("AppLog", "FakeActivity")
        finish()
    }
}

Sie können diese Aktivität mit diesem Thema auch für den Benutzer fast unsichtbar machen:

    <style name="AppTheme.Translucent" parent="@style/Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

Leider ist dies eine seltsame Problemumgehung. Ich hoffe, eine bessere Lösung dafür zu finden.

Die Einschränkung bezieht sich auf das Starten von Aktivität. Daher ist meine aktuelle Idee, dass es möglicherweise auch hilfreich ist, wenn ich einen Vordergrunddienst für den Bruchteil einer Sekunde starte, und dafür benötige ich nicht einmal die SAW-Berechtigung.

EDIT: OK Ich habe es mit einem Vordergrunddienst versucht (Beispiel hier ), und es hat nicht funktioniert. Keine Ahnung, warum eine Aktivität funktioniert, aber kein Dienst. Ich habe sogar versucht, den Alarm dort neu zu planen, und versucht, den Service auch nach einer Neuplanung für eine Weile stehen zu lassen. Ich habe auch einen normalen Dienst ausprobiert, aber natürlich wurde er sofort geschlossen, da die Aufgabe entfernt wurde und überhaupt nicht funktionierte (selbst wenn ich einen Thread erstellt habe, der im Hintergrund ausgeführt werden soll).

Eine andere mögliche Lösung, die ich nicht ausprobiert habe, besteht darin, für immer einen Vordergrunddienst zu haben, oder zumindest bis die Aufgabe entfernt wurde. Dies ist jedoch etwas seltsam und ich sehe die Apps, die ich erwähnt habe, nicht.

BEARBEITEN: Es wurde versucht, einen Vordergrunddienst auszuführen, bevor die Aufgabe der App entfernt wurde, und einige Zeit danach, und der Alarm funktionierte immer noch. Es wurde auch versucht, diesen Dienst als Verantwortlichen für das Entfernen von Aufgaben zu verwenden und sich sofort zu schließen, wenn er auftritt, und er funktionierte immer noch (Beispiel hier ). Der Vorteil dieser Problemumgehung besteht darin, dass Sie überhaupt nicht über die SAW-Berechtigung verfügen müssen. Der Nachteil ist, dass Sie einen Dienst mit einer Benachrichtigung haben, während die App für den Benutzer bereits sichtbar ist. Ich frage mich, ob es möglich ist, die Benachrichtigung auszublenden, während die App über die Aktivität bereits im Vordergrund steht.


BEARBEITEN: Scheint ein Fehler in Android Studio zu sein ( hier gemeldet , einschließlich Videos, in denen Versionen verglichen werden). Wenn Sie die App von der problematischen Version aus starten, die ich versucht habe, können die Alarme gelöscht werden.

Wenn Sie die App über den Launcher starten, funktioniert sie einwandfrei.

Dies ist der aktuelle Code zum Einstellen des Alarms:

        val timeToTrigger = System.currentTimeMillis() + 10 * 1000
        val pendingShowList = PendingIntent.getActivity(this, 1, Intent(this, SomeActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        val pendingIntent = PendingIntent.getBroadcast(this, 1, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
        manager.setAlarmClock(AlarmManager.AlarmClockInfo(timeToTrigger, pendingShowList), pendingIntent)

Ich muss nicht einmal "pendingShowList" verwenden. Die Verwendung von null ist ebenfalls in Ordnung.

Android-Entwickler
quelle
Ich möchte nur eine Aktivität onReceive () auf AndroidQ starten. Gibt es dafür Problemumgehungen ohne SYSTEM_ALERT_WINDOWErlaubnis?
Doctorram
2
Warum macht Google das Leben von Android-Entwicklern immer zur Hölle über einfache Dinge?!
Doctorram
@doctorram Ja, es steht in den Dokumenten über die verschiedenen Ausnahmen: developer.android.com/guide/components/activities/… . Ich habe gerade SYSTEM_ALERT_WINDOW gewählt, weil es am einfachsten zu testen ist.
Android-Entwickler
Meinen Sie damit, dass wir nach Ihrer letzten Bearbeitung keine von Ihnen erwähnten Problemumgehungen verwenden müssen, um die Alarme nach dem Entfernen der App aus der letzten Liste beizubehalten?
user3410835
Ich möchte jeden Tag zwischen 6 und 7 Uhr im Hintergrund einen Code ausführen, auch wenn die App aus der letzten Liste entfernt wurde. Ich sollte WorkManager oder AlarmManager verwenden? Versuchte den folgenden Code für meinen Anwendungsfall und es hat nicht funktioniert. Was ist das Problem mit dem folgenden Code? calendar.setTimeInMillis (System.currentTimeMillis ()); calendar.set (Calendar.HOUR_OF_DAY, 6); alarmManager.setInexactRepeating (AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis (), AlarmManager.INTERVAL_DAY, pendingIntent);
user3410835
1
  1. Stellen Sie sicher, dass die von Ihnen gesendete Absicht explizit ist und das Intent.FLAG_RECEIVER_FOREGROUNDFlag hat.

https://developer.android.com/about/versions/oreo/background#broadcasts

Intent intent = new Intent(context, Receiver.class);
intent.setAction(action);
...
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

PendingIntent operation = PendingIntent.getBroadcast(context, 0, intent, flags);
  1. Verwenden , setExactAndAllowWhileIdle()wenn API Targeting 23+.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, operation);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, time, operation);
} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, time, operation);
}
  1. Starten Sie Ihren Alarm als Vordergrunddienst:

https://developer.android.com/about/versions/oreo/background#migration

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(intent);
} else {
    context.startService(intent);
}
  1. Und Berechtigungen nicht vergessen:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Maksim Ivanov
quelle
Warum ist es wichtig für den Dienst, wenn der BroadcastReceiver selbst die Absicht überhaupt nicht (oder in der Nähe der Zeit) erhält? Das ist der erste Schritt ... Bietet AlarmManagerCompat nicht bereits denselben Code an? Haben Sie dies mit den von mir geschriebenen Tests versucht, einschließlich des Entfernens der App aus den letzten Aufgaben? Können Sie bitte den gesamten Code anzeigen? Vielleicht auf Github teilen?
Android-Entwickler
@androiddeveloper hat die Antwort aktualisiert.
Maksim Ivanov
Scheint immer noch nicht zu funktionieren. Hier ist ein Beispielprojekt: ufile.io/6qrsor7o . Bitte versuchen Sie es mit Android 10 (Emulator ebenfalls in Ordnung), stellen Sie den Alarm ein und entfernen Sie die App aus den letzten Aufgaben. Wenn Sie nicht aus den letzten Aufgaben entfernen, funktioniert dies einwandfrei und wird nach 10 Sekunden ausgelöst.
Android-Entwickler
Ich habe die Frage auch aktualisiert, um einen Link zu einem Fehlerbericht zu erhalten, der ein Beispielprojekt und ein Video enthält, da ich denke, dass dies ein Fehler ist, da ich keinen anderen Grund dafür sehe.
Android-Entwickler
0

Ich weiß, dass dies nicht effizient ist, aber mit einer Genauigkeit von 60 Sekunden konsistenter sein könnte.

https://developer.android.com/reference/android/content/Intent#ACTION_TIME_TICK

Wenn dieser Rundfunkempfänger in einem Vordergrunddienst verwendet wird, können Sie die Uhrzeit jede Minute überprüfen und eine Entscheidung über eine Aktion treffen.

Hart
quelle
Wenn ich einen Vordergrunddienst habe, warum sollte ich diesen brauchen? Ich könnte einfach einen Handler.postDelayed oder eine andere ähnliche Lösung verwenden, wenn ich möchte ...
Android-Entwickler
0

Ich denke, Sie können den Benutzer bitten, die Berechtigung so festzulegen, dass der Energiesparmodus deaktiviert wird, und den Benutzer warnen, dass genaue Zeiten nicht erreicht werden, wenn er sie nicht verwendet.

Hier ist der Code, um ihn anzufordern:

PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE);
            String packageName = "your Package name";
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                Intent i = new Intent();
                if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
                    i.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    i.setData(Uri.parse("package:" + packageName));
                    startActivity(i);
user2638180
quelle
Ich habe dies bereits versucht, da ich bemerkt habe, dass keine andere App dies tut und neugierig war, ob es helfen kann. Hat nicht funktioniert. Aktualisierte Frage.
Android-Entwickler
0

Ich bin der Autor des Open-Source-Projekts, das Sie in Ihrer Frage erwähnt haben ( einfacher Wecker) .

Ich bin überrascht, dass die Verwendung von AlarmManager.setAlarmClock bei Ihnen nicht funktioniert hat, da meine App genau das tut. Der Code befindet sich in der Datei AlarmSetter.kt. Hier ist ein Ausschnitt:

  val pendingAlarm = Intent(ACTION_FIRED)
                .apply {
                    setClass(mContext, AlarmsReceiver::class.java)
                    putExtra(EXTRA_ID, id)
                    putExtra(EXTRA_TYPE, typeName)
                }
                .let { PendingIntent.getBroadcast(mContext, pendingAlarmRequestCode, it, PendingIntent.FLAG_UPDATE_CURRENT) }

            val pendingShowList = PendingIntent.getActivity(
                    mContext,
                    100500,
                    Intent(mContext, AlarmsListActivity::class.java),
                    PendingIntent.FLAG_UPDATE_CURRENT
            )

            am.setAlarmClock(AlarmManager.AlarmClockInfo(calendar.timeInMillis, pendingShowList), pendingAlarm)

Grundsätzlich ist es nichts Besonderes, stellen Sie nur sicher, dass Intent eine Aktion und eine Zielklasse hat, die in meinem Fall ein Rundfunkempfänger ist.

Yuriy Kulikov
quelle
Hat leider nicht funktioniert. Das habe ich versucht. Siehe Dateien hier: github.com/yuriykulikov/AlarmClock/issues/…
Android-Entwickler
Ich habe deinen Code auf GitHub ausgecheckt. Der Broadcast-Empfänger funktioniert, nachdem die App aus den letzten Versionen von Moto Z2 Play entfernt wurde. Ich kann es auf einem Pixel versuchen, aber Code scheint mir in Ordnung zu sein. Durch erzwungenes Stoppen der Anwendung wird der geplante Alarm entfernt. Dies tritt jedoch bei jeder App auf, deren Erzwingen gestoppt wird.
Yuriy Kulikov
Ich habe bereits mehrere Male gezeigt: Alles, was ich nach der Planung tue, ist, aus den letzten Aufgaben zu entfernen. Und ich habe es sowohl auf Emulator als auch auf Pixel 4 gemacht.
Android-Entwickler
Bitte überprüfen Sie, ob die Verwendung von pendingShowList das Problem umgeht. Wenn ja, werde ich die Antwort aktualisieren. Vielleicht ist es für jemanden nützlich.
Yuriy Kulikov