Das hat mich verblüfft, ich habe dies im Android 2.1-r8 SDK verwendet:
ProgressDialog.show(getApplicationContext(), ....);
und auch in
Toast t = Toast.makeText(getApplicationContext(),....);
mit getApplicationContext()
Abstürzen beide ProgressDialog
und Toast
.... was mich zu dieser Frage führt:
Was sind die tatsächlichen Unterschiede zwischen einem Aktivitätskontext und einem Anwendungskontext, obwohl der Wortlaut "Kontext" geteilt wird?
android
android-context
t0mm13b
quelle
quelle
Antworten:
Sie sind beide Instanzen des Kontexts , aber die Anwendungsinstanz ist an den Lebenszyklus der Anwendung gebunden, während die Aktivitätsinstanz an den Lebenszyklus einer Aktivität gebunden ist. Somit haben sie Zugriff auf verschiedene Informationen über die Anwendungsumgebung.
Wenn Sie die Dokumente unter getApplicationContext lesen , sollten Sie diese nur verwenden, wenn Sie einen Kontext benötigen, dessen Lebenszyklus vom aktuellen Kontext getrennt ist. Dies gilt in keinem Ihrer Beispiele.
Der Aktivitätskontext enthält vermutlich einige Informationen über die aktuelle Aktivität, die zum Abschließen dieser Aufrufe erforderlich ist. Wenn Sie die genaue Fehlermeldung anzeigen, können Sie möglicherweise genau angeben, was benötigt wird.
Verwenden Sie im Allgemeinen den Aktivitätskontext, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.
quelle
getApplicationContext
, wenn ich interessanterweise verwendet habe, als ich zu gewechselt habethis
, es nicht abgestürzt ist und wie erwartet funktioniert hat. Wenn also beide Instanzen von Context sind, warum funktioniert man dann nicht und der andere tut? Diese Informationen werden anderen helfen, hoffe ich ... :) Danke für Ihre schnelle Antwort ...Ich fand diese Tabelle sehr nützlich, um zu entscheiden, wann verschiedene Arten von Kontexten verwendet werden sollen:
Originalartikel hier .
quelle
Dies ist offensichtlich ein Mangel des API-Designs. Erstens sind Aktivitätskontext und Anwendungskontext völlig unterschiedliche Objekte, daher sollten die Methodenparameter, in denen der Kontext verwendet wird,
ApplicationContext
oderActivity
direkt verwendet werden, anstatt den Kontext der übergeordneten Klasse zu verwenden. Zweitens sollte das Dokument angeben, welcher Kontext verwendet werden soll oder nicht.quelle
Der Grund, den ich denke, ist, dass er
ProgressDialog
an die Aktivität angehängt ist, die das unterstützt,ProgressDialog
da der Dialog nicht bleiben kann, nachdem die Aktivität zerstört wurde. Daher muss er übergeben werdenthis
(ActivityContext), der auch mit der Aktivität zerstört wird, während der ApplicationContext auch nach dem Abrufen der Aktivität erhalten bleibt zerstört.quelle
Verwenden Sie getApplicationContext (), wenn Sie etwas benötigen, das an einen Kontext gebunden ist, der selbst einen globalen Gültigkeitsbereich hat.
Wenn Sie Activity verwenden, verfügt die neue Activity-Instanz über eine Referenz, die implizit auf die alte Activity verweist, und die alte Activity kann nicht durch Müll gesammelt werden.
quelle
Ich denke, wenn alles einen Bildschirm zum Anzeigen benötigt (Schaltfläche, Dialog, Layout ...), müssen wir Kontextaktivität verwenden, und alles benötigt keinen Bildschirm zum Anzeigen oder Verarbeiten (Toast, Servicetelefon, Kontakt ...) könnte einen Anwendungskontext verwenden
quelle
Sie können einen Unterschied zwischen den beiden Kontexten feststellen, wenn Sie Ihre App direkt vom Startbildschirm aus starten, und wenn Ihre App über eine gemeinsame Absicht von einer anderen App aus gestartet wird.
Hier ein praktisches Beispiel dafür, was "nicht standardmäßiges Backstack-Verhalten", das von @CommonSenseCode erwähnt wird, bedeutet:
Angenommen, Sie haben zwei Apps, die miteinander kommunizieren, App1 und App2 .
Starten Sie App2: MainActivity vom Launcher aus. Starten Sie dann von MainActivity aus App2: SecondaryActivity . Dort befinden sich beide Aktivitäten entweder im Aktivitätskontext oder im Anwendungskontext in derselben Aufgabe, und dies ist in Ordnung (vorausgesetzt, Sie verwenden alle Standardstartmodi und Absichtsflags). Sie können mit einem Druck auf MainActivity zurückkehren, und in den letzten Apps haben Sie nur eine Aufgabe.
Angenommen, Sie befinden sich jetzt in App1 und starten App2: MainActivity mit einer Freigabeabsicht (ACTION_SEND oder ACTION_SEND_MULTIPLE). Versuchen Sie dann von dort aus, App2: SecondaryActivity zu starten (immer mit allen Standardstartmodi und Absichtsflags). Was passiert ist:
Wenn Sie App2: SecondaryActivity mit Anwendungskontext unter Android <10 starten, können Sie nicht alle Aktivitäten in derselben Aufgabe starten . Ich habe es mit Android 7 und 8 versucht und die SecondaryActivity wird immer in einer neuen Aufgabe gestartet (ich denke, das liegt daran, dass App2: SecondaryActivity mit dem App2-Anwendungskontext gestartet wird, aber Sie kommen von App1 und haben die App2-Anwendung nicht direkt gestartet Vielleicht unter der Haube Android erkennen und FLAG_ACTIVITY_NEW_TASK verwenden). Dies kann je nach Ihren Bedürfnissen gut oder schlecht sein, da meine Bewerbung schlecht war.
Unter Android 10 stürzt die App mit der Meldung ab, dass für das
Aufrufen von startActivity () außerhalb eines Aktivitätskontexts das Flag FLAG_ACTIVITY_NEW_TASK erforderlich ist. Ist dies wirklich das, was Sie möchten?.
Damit es unter Android 10 funktioniert, müssen Sie FALG_ACTIVITY_NEW_TASK verwenden und können nicht alle Aktivitäten in derselben Aufgabe ausführen.
Wie Sie sehen können, ist das Verhalten zwischen Android-Versionen unterschiedlich, seltsam.
Wenn Sie App2: SecondaryActivity mit Aktivitätskontext starten, funktioniert alles gut und Sie können alle Aktivitäten in derselben Aufgabe ausführen, was zu einer linearen Backstack-Navigation führt.
Ich hoffe, ich habe einige nützliche Informationen hinzugefügt
quelle