Ich verwende ein AlarmManager
, um eine Absicht auszulösen, die ein Signal sendet. Folgendes ist mein Code:
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(this, Wakeup.class);
try
{
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
Long elapsed += // sleep time;
mgr.set(AlarmManager.RTC_WAKEUP, elapsed, pi);
}
catch(Exception r)
{
Log.v(TAG, "RunTimeException: " + r);
}
Ich rufe diesen Code von einem auf Activity
, daher weiß ich nicht, wie ich den folgenden Fehler erhalten könnte ...
ERROR/AndroidRuntime(7557): java.lang.RuntimeException: Unable to start receiver com.wcc.Wakeup: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Verwenden Sie für mehrere Instanzen derselben Aktivität das folgende Snippet:
Hinweis : Dieses Snippet verwende ich außerhalb meines
Activity
. Stellen Sie sicher, dass IhreAndroidManifest
Datei nicht enthältandroid:launchMode="singleTop|singleInstance"
. Bei Bedarf können Sie es in ändernandroid:launchMode="standard"
.Das funktioniert gut für mich. Hoffe, das spart jemandem Zeit. Wenn jemand einen besseren Weg findet, teilen Sie uns dies bitte mit.
quelle
Android Doc sagt -
Das bedeutet
(Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
, dass das HinzufügenIntent.FLAG_ACTIVITY_NEW_TASK
beim AufrufenstartActivity()
von außerhalb einesActivity
Kontexts obligatorisch ist .Es ist also besser, für alle Versionen ein Flag hinzuzufügen -
quelle
Sie haben den Teil, in dem Sie anrufen
startActivity
, nicht eingefügt , das ist der interessante Teil.Möglicherweise rufen Sie
startActivity
in einemService
Kontext oder in einemApplication
Kontext auf.Drucken Sie "dies" aus, um die Katze zu protokollieren, bevor Sie den
startActivity
Anruf tätigen, und sehen Sie, worauf es sich bezieht. Manchmal wird versehentlich ein inneres "dies" verwendet.quelle
Manchmal kann dieser Fehler ohne expliziten Aufruf von auftreten
startActivity(...)
. Einige von Ihnen haben beispielsweise in Crashlytics eine solche Stapelverfolgung gesehen:Und Sie fragen sich vielleicht, was Sie falsch gemacht haben, da der Trace nur Framework-Code enthält. Hier ist ein Beispiel, wie dies passieren kann. Nehmen wir an, wir sind in einem Fragment.
Wenn ein Benutzer auf diese Textansicht klickt, stürzt Ihre App mit der obigen Stapelverfolgung ab. Dies liegt daran , das Layout inflater einen Verweis auf die hat Anwendungskontext , und so daher Ihre Textansicht hat einen Anwendungskontext. Durch Klicken auf diese Textansicht wird implizit aufgerufen
appContext.startActivity(...)
.Letzte Anmerkung: Ich habe dies auf Android 4, 5, 6 und 7 Geräten getestet. Es betrifft nur 4, 5 und 6. Android 7-Geräte haben anscheinend keine Probleme beim Anrufen
appContext.startActivity(...)
.Ich hoffe das hilft jemand anderem!
quelle
Dieselbe Fehler, mit der ich beim Erhalten einer Benachrichtigung auf den neuesten Android-Geräten 9 und 10 konfrontiert war.
Es hängt vom Startmodus ab, wie Sie damit umgehen. Verwenden Sie den folgenden Code: - android: launchMode = "singleTask"
Fügen Sie dieses Flag mit Intent hinzu: - intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
quelle
Versuchen Sie, in diese Zeile zu wechseln:
quelle
Ich möchte nur bemerken, dass
startActivity
eine Aktivität von außerhalb in einigen Android-Versionen (zwischen N und O-MR1) gültig ist und der interessante Punkt ist, dass es sich um einen Fehler im Android-Quellcode handelt!Dies ist der Kommentar über der
startActivity
Implementierung. Siehe hier .quelle
Wenn Sie eine Aktivität in Ihrer App öffnen möchten, können Sie die Methode startActivity () mit einem Intent als Parameter aufrufen. Diese Absicht wäre die Aktivität, die Sie öffnen möchten. Zuerst müssen Sie ein Objekt dieser Absicht erstellen, wobei der erste Parameter der Kontext und der zweite Parameter die Zielaktivitätsklasse ist.
Hoffe das wird helfen.
quelle