2016-12-04 4 views
3

Während ich mit verschiedenen Aktivitäten arbeite und sie für Ergebnisse starte, habe ich keine andere Wahl, als Absicht zu verwenden. Jetzt erfordert Absicht Kontext und das ergibt für mich keinen Sinn. Ich weiß, dass Kontext ermöglicht den Zugriff auf die Anwendungsressourcen aberWarum erfordert die Absicht Kontext?

Warum müssen Sie über die Anwendungsressourcen wissen, wenn eine Absicht nur ein einfacher Messenger ist?

Auch ich bin nicht so sicher, warum einige Menschen Absicht mit der getApplicationContext() erstellen, während andere dies für den Aktivitätskontext verwenden ????

Schließlich bin ich nicht so sicher, wie die Aktivität, die für startActivityResult() ruft einen Rückruf auf die Methode onActivityResult() erhalten, wenn ich nicht das "dies" für den Kontext, sondern stattdessen den Anwendungskontext übergeben. Ich dachte, dass Sie das "Dies" verwenden oder den aktuellen Aktivitätskontext übergeben müssen, der startActivityResult() aufgerufen hat, um einen Rückruf zu erhalten. Das ist nur gerade nach oben, oder? Wenn Sie eine Klasse übergeben, hat die andere Aktivitätsklasse einen Verweis auf Ihre Klasse und kann daher die Methode in Ihrer Klasse aufrufen (onActivityForResult(). Dies ist jedoch nicht der Fall, also was fehlt mir?

Antwort

4

Intent selbst nicht die Context. Der Konstruktor Intent#Intent(Context, Class) ist nur ein Konstruktor für die Bequemlichkeit, der intern die angegebenen Argumente verwendet, um eine ComponentName abzuleiten. ComponentName ist wiederum nur ein Paketname Ihrer App und ein Klassenname zum Ziel. So ComponentName könnte so etwas wie sein:

com.foo.bar/com.foo.bar.ui.activity.MyActivity 

Sie können jedoch auch verwenden nur einen leeren Konstruktor Intent#Intent() und bieten ComponentName selbst (Intent#setComponentName(ComponentName)).

Daher ist es egal, ob Sie den Kontext Ihrer Anwendung oder Ihrer Aktivität angeben (Letzteres ist einfacher zu tippen). Denken Sie auch daran, dass Klassen, die einen Anwendungskontext erfordern, sich selbst anrufen können, sodass Sie sich keine Sorgen machen müssen.

Über startActivityForResult() - Android verwaltet intern einen Stapel Ihrer Aktivitätsdatensätze. Daher liefert es das Ergebnis an die vorherige Aktivität auf dem Stapel. Es ist genau so, wie es weiß, wohin es zurückkehren soll, wenn Sie auf "Zurück" klicken.

Bitte beachten Sie, dass es nicht einen Stapel Ihrer Activity-Instanzen verwaltet. Diese Instanzen sind möglicherweise längst verschwunden - zerstört und Müll gesammelt, um den Speicher freizugeben. Der Stapel enthält jedoch die Informationen, die es ermöglichen, sie neu zu erstellen und ihren Status wiederherzustellen.

+0

Hallo, Ihre Antwort ist sehr klar und prägnant. Ich möchte jedoch nur eine kurze Erläuterung. Wenn ich also eine Aktivität starte, wird die Aktivität, die startActivity() aufruft, im Stack korrekt registriert? Wie weiß Android also, diese Aktivität zu referenzieren und sie in einem Stapel zu registrieren, wenn ich diese Aktivität nicht speziell übergebe. – Wowzer

+0

Das System weiß, welche Aktivität oben auf dem Stapel liegt (Ihre Aktivität). Und wenn Sie eine neue beginnen, verwendet sie einen Komponentennamen, um sie zu identifizieren. Selbst wenn Sie eine implizite Absicht verwenden (eine mit Aktion anstelle eines expliziten Zielnamens), wird sie möglicherweise in einen bestimmten Komponentennamen aufgelöst. –

0

Nicht viel tief in Android-Entwicklung, aber lassen Sie mich noch mit einer Erklärung versuchen. Also im Grunde, Kontext ist ein Verweis auf die Verknüpfung Ihrer Ressourcen zu Ihrem Programm. Jedes Objekt erhält seinen eigenen Kontext, der die Ressourcen enthält, die benötigt werden, um das Objekt zu erstellen. Es ist erforderlich, dass viele Objekte erstellt werden und unter anderem Programmidentifizierungsinformationen erhalten. Dies macht es unschätzbar, neue Ansichten und Aktivitäten einzurichten, aber es kann auch für andere Zwecke verwendet werden. Weitere Informationen finden Sie unter Android Context.

Nach diesem pageActivity inherits context. Wenn Sie sich in einer Aktivität befinden, müssen Sie sich nur selbst übergeben, um den Kontext zu verwenden. Es enthält auch einen Zeiger auf getBaseContext(). Sie müssen gelegentlich darauf verweisen, wenn Sie den gesamten Anwendungskontext benötigen, aber höchstwahrscheinlich nicht für eine Weile.

Es gibt Möglichkeiten, eine Absicht zu erstellen, für die kein Kontext erforderlich ist. Wenn Sie jedoch eine bestimmte Klasse eines bestimmten Pakets als Ziel auswählen möchten, können Sie hierfür einen Kontext für das Zielpaket bereitstellen. Siehe hierzu Context Lesson.

Wie von Snctin in seinem answergetApplicationContext() offers application context erklärt. Grundsätzlich ist der Anwendungskontext mit der Anwendung verknüpft und wird während des gesamten Lebenszyklus Ihrer App immer gleich sein. Siehe auch this post.

Siehe Android - How to start (display) a new Activity. Nach ihr

startActivity(new Intent(this, ProjectsActivity.class));

übernimmt Ihre aktuelle Klasse eine der Android Aktivitätsklassen erweitert, was können Sie auf der startActivity Methode zugreifen.

Gemäß Getting result from a activity muss der Start einer anderen Aktivität nicht in eine Richtung erfolgen. Sie können auch eine andere Aktivität starten und ein Ergebnis zurück erhalten. Um ein Ergebnis zu erhalten, rufen Sie startActivityForResult() auf (anstelle von startActivity()).

Zum Beispiel kann Ihre App eine Kamera-App starten und das aufgenommene Foto als Ergebnis erhalten. Oder Sie starten die People-App, damit der Benutzer einen Kontakt auswählen kann. Daraufhin erhalten Sie die Kontaktdetails. Diese post wird Ihnen helfen, den gleichen besseren Weg zu verstehen.

Hoffe, dass hilft. Und auch danke, wegen Ihrer Frage ich hatte eine Aktualisierung mit Android. :)

0

Intent braucht nicht Context für sich selbst, aber wie Sie selbst darauf hingewiesen, dass Intent ist nur ein Messenger. Es übergibt auch den aktuellen Zustand der Anwendung/des Objekts an das neu erstellte Objekt, damit es verstehen kann, was genau in der Anwendung vor sich geht. Und deshalb müssen wir den Kontext weitergeben.

Und ich glaube, dass Sie über startActivityForResult() fragen möchten. Android selbst kümmert sich um den Rückruf auf die gleiche Weise wie andere Rückrufe behandelt werden. Sie können das Beispiel Aktivitätslebenszyklus nehmen. Wann immer es gestartet wird onCreate(), onStart(), onResume() nennt sich selbst von Android.

+0

Ich glaube nicht, dass der Kontext verwendet wird, um zu verstehen, was in der Anwendung vor sich geht, denn wenn Sie die neue Aktivität starten, wird Android nur den Kontext dieser neuen Aktivität standardmäßig geben, da alle Aktivitäten vom selben Anwendungskontext erben dass die Aktivität innerhalb der Anwendung liegt – Wowzer

+0

Android wird sich den Anwendungskontext für die neue Aktivität nicht geben. Es gibt einen Unterschied s/w, der getAplicationContext() benutzt und dieses benutzt. Android stellt den Kontext zur Verfügung, den Sie angeben möchten. Siehe Frage Nr. 1026973 – hittsss

Verwandte Themen