Frage Was ist "Kontext" auf Android?


In der Android-Programmierung, was genau ist ein Context Klasse und wofür wird es verwendet?

Ich habe es auf der Entwicklerseite gelesen, aber ich kann es nicht klar verstehen.


1576
2017-08-26 06:12


Ursprung


Antworten:


Einfach ausgedrückt:

Wie der Name schon sagt, ist dies der Kontext des aktuellen Status der Anwendung / des Objekts. Es lässt neu erstellte Objekte verstehen, was vor sich gegangen ist. Normalerweise rufen Sie es auf, um Informationen zu einem anderen Teil Ihres Programms (Aktivität und Paket / Anwendung) zu erhalten.

Sie können den Kontext abrufen, indem Sie ihn aufrufen getApplicationContext(), getContext(), getBaseContext() oder this (in einer Klasse, die von ContextB. die Anwendungs-, Aktivitäts-, Service- und IntentService-Klassen).

Typische Verwendungen von Kontext:

  • Erstellen neuer Objekte: Erstellen neuer Ansichten, Adapter, Listener:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
    
  • Zugriff auf gemeinsame Standardressourcen: Dienste wie LAYOUT_INFLATER_SERVICE, SharedPreferences:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
    
  • Zugreifen auf Komponenten implizit: In Bezug auf Content-Anbieter, Broadcasts, Absicht

    getApplicationContext().getContentResolver().query(uri, ...);
    

1239
2017-08-26 06:32



Definition des Kontextes ::

  • Kontext repräsentiert Umgebungsdaten
  • Es bietet Zugriff auf Dinge wie Datenbanken

Einfachere Begriffe ::

  • Betrachten Sie Person-X ist der CEO eines Start-up-Softwareunternehmens.

  • In der Firma ist ein leitender Architekt anwesend, dieser Hauptarchitekt macht die ganze Arbeit in der Firma, die wie Datenbank, UI beinhaltet etc.

  • Jetzt stellt der CEO einen neuen Entwickler ein.

  • Es ist der Architekt, der die Verantwortung des neu Eingestellten angibt Person basierend auf den Fähigkeiten der neuen Person, ob er will Arbeit an Datenbank oder UI usw.

Einfachere Begriffe ::

  • Es ist wie der Zugriff von Android-Aktivitäten auf die Ressource der App.

  • Es ist ähnlich wie wenn Sie ein Hotel besuchen, Sie wollen Frühstück, Mittagessen und Abendessen in den passenden Zeiten, oder?

  • Es gibt viele andere Dinge, die Sie während der Zeit des Aufenthalts mögen. Wie geht es dir? bekomme diese dinge?

  • Sie bitten den Zimmerservice-Mitarbeiter, diese Dinge für Sie zu bringen.

  • Hier ist der Raum-Service-Person der Kontext, der in Betracht zieht, du bist der Single-Aktivität und das Hotel, um Ihre App zu sein, endlich das Frühstück, Mittagessen und Abendessen müssen die Ressourcen sein.


Dinge, die den Kontext betreffen, sind:

  1. Eine Ressource laden
  2. Starten einer neuen Aktivität
  3. Ansichten erstellen
  4. Systemdienst erhalten.

Kontext ist die Basisklasse für Aktivität, Bedienung, Anwendung .... etc

Eine andere Möglichkeit, dies zu beschreiben: Betrachten Sie den Kontext als Fernbedienung eines Fernsehers und eines Kanals im Fernsehen sind Ressourcen, Dienste, Intents usw. - - Hier fungiert Remote als Zugang, um Zugriff auf alle verschiedenen Ressourcen in den Vordergrund zu bekommen.

  • So hat Remote Zugriff auf Kanäle wie Ressourcen, Dienste, Intents usw.
  • Ebenso ..... Wer auf remote Zugriff hat, hat natürlich Zugriff auf alle Dinge wie Ressourcen, Dienste, Intents etc

Verschiedene Methoden, mit denen Sie Kontext bekommen können

  • getApplicationContext()
  • getContext()
  • getBaseContext()
  • oder this (wenn in der Aktivitätsklasse)

Beispiel:

TextView TV=new TextView(this);

this -> bezieht sich auf den Kontext der aktuellen Aktivität.


408
2017-08-20 05:25



Quelle


Das Thema Kontext in Android scheint für viele verwirrend zu sein. Die Leute wissen einfach, dass Context häufig benötigt wird, um grundlegende Dinge in Android zu tun. Die Leute geraten manchmal in Panik, weil sie versuchen, eine Operation auszuführen, die den Kontext erfordert, und sie wissen nicht, wie sie den richtigen Kontext "bekommen" können. Ich werde versuchen, die Idee von Context in Android zu entmystifizieren. Eine vollständige Behandlung des Themas geht über den Rahmen dieses Beitrags hinaus, aber ich werde versuchen, einen allgemeinen Überblick zu geben, damit Sie einen Sinn dafür haben, was Kontext ist und wie man ihn verwendet. Um zu verstehen, was Context ist, werfen wir einen Blick auf den Quellcode:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

Was genau ist Kontext? 

Nun, die Dokumentation selbst bietet eine recht einfache Erklärung: Die Kontext-Klasse ist eine "Schnittstelle zu globalen Informationen über eine Anwendungsumgebung".

Die Context-Klasse selbst ist als abstrakte Klasse deklariert, deren Implementierung vom Android OS bereitgestellt wird. Die Dokumentation stellt außerdem bereit, dass Kontext "... Zugriff auf anwendungsspezifische Ressourcen und Klassen sowie auf Aufrufe für Vorgänge auf Anwendungsebene wie das Starten von Aktivitäten, Senden und Empfangen von Absichten usw. erlaubt".

Sie können jetzt sehr gut verstehen, warum der Name Context ist. Weil es genau das ist. Der Kontext stellt den Link oder den Hook für eine Aktivität, einen Service oder eine andere Komponente bereit, wodurch er mit dem System verbunden wird und der Zugriff auf die globale Anwendungsumgebung ermöglicht wird. Mit anderen Worten: Der Kontext liefert die Antwort auf die Komponentenfrage "Wo zum Teufel bin ich in Bezug auf die App generell und wie kann ich mit dem Rest der App kommunizieren?" Wenn das alles ein wenig verwirrend erscheint, dann schnell Sehen Sie sich die Methoden an, die von der Context-Klasse bereitgestellt werden, und liefern Sie weitere Hinweise auf ihre wahre Natur.

Hier ist eine zufällige Auswahl dieser Methoden:

  1. getAssets() 
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

Was haben all diese Methoden gemeinsam? Sie alle ermöglichen es jedem, der Zugriff auf den Kontext hat, auf anwendungsweite Ressourcen zugreifen zu können.

Mit anderen Worten hakt der Kontext die Komponente, die einen Verweis darauf hat, mit der restlichen Anwendungsumgebung. Die Assets (Ordner think / assets in Ihrem Projekt) sind beispielsweise in der gesamten Anwendung verfügbar, sofern eine Aktivität, ein Service oder was auch immer weiß, wie auf diese Ressourcen zugegriffen werden kann. Gleiches gilt für getResources() was erlaubt, Dinge wie zu tun getResources().getColor() was dich in die colors.xml Ressource (vergesst nicht, dass aapt den Zugriff auf Ressourcen über Java-Code ermöglicht, das ist ein separates Problem).

Das Ergebnis ist das Context ermöglicht den Zugriff auf Systemressourcen und deren Komponenten in die "größere App". Schauen wir uns die Unterklassen an Contextdie Klassen, die die Implementierung des Abstracts bereitstellen Context Klasse. Die offensichtlichste Klasse ist die Activity Klasse. Activityerbt von ContextThemeWrapper, die von erbt ContextWrapper, die von erbt Context selbst. Diese Klassen sind nützlich, um Dinge auf einer tieferen Ebene zu verstehen, aber im Moment reicht es, das zu wissen ContextThemeWrapper und ContextWrapper sind so ziemlich wie sie klingen. Sie implementieren die abstrakten Elemente der Context Klasse selbst, indem ein Kontext (der tatsächliche Kontext) "umbrochen" wird und diese Funktionen an diesen Kontext delegiert werden.  Ein Beispiel ist hilfreich - in der ContextWrapper Klasse, die abstrakte Methode getAssets von dem Context Die Klasse wird wie folgt implementiert:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBase ist einfach ein Feld, das vom Konstruktor in einen bestimmten Kontext gesetzt wird. So ist ein Kontext verpackt und die ContextWrapper delegiert die Implementierung der Methode "getAssets" an diesen Kontext. Lassen Sie uns zurück zur Untersuchung der Activity Klasse, die letztlich von erbt Context um zu sehen, wie das alles funktioniert.

Sie wissen wahrscheinlich, was eine Aktivität ist, aber zu überprüfen - es ist im Grunde 'eine einzige Sache, die der Benutzer tun kann. Es stellt ein Fenster bereit, in dem die Benutzeroberfläche platziert wird, mit der der Benutzer interagiert. Entwickler, die mit anderen APIs und sogar Nicht-Entwicklern vertraut sind, könnten sie im Allgemeinen als "Bildschirm" bezeichnen. Das ist technisch ungenau, aber für unsere Zwecke spielt es keine Rolle. So wie Activity und Context interagieren und was genau ist in ihrer Erbschaftsbeziehung?

Auch hier ist es hilfreich, sich spezifische Beispiele anzusehen. Wir alle wissen, wie man Aktivitäten startet. Sofern Sie "den Kontext" haben, aus dem Sie die Aktivität starten, rufen Sie einfach an startActivity(intent)Hier beschreibt der Intent den Kontext, aus dem Sie eine Aktivität starten, und die Aktivität, die Sie starten möchten. Das ist das Vertraute startActivity(this, SomeOtherActivity.class).

Und was ist this? this ist deine Aktivität, weil die Activity Klasse erbt von Context. Der volle Scoop ist wie folgt: Wenn du anrufst startActivityLetztendlich die Activity Klasse führt so etwas aus:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

So nutzt es die execStartActivity von dem Instrumentation Klasse (eigentlich aus einer inneren Klasse in Instrumentation namens ActivityResult).

An diesem Punkt beginnen wir, einen Blick auf die Systemeinbauten zu werfen.

Dies ist, wo OS tatsächlich alles behandelt. Wie startet Instrumentation die Aktivität genau? Nun, der Param this in dem execStartActivity Methode oben ist Ihre Aktivität, d. h. der Kontext, und die execStartActivity nutzt diesen Kontext.

Ein Überblick über 30.000 ist dies: Die Instrumentation-Klasse führt Spuren einer Liste von Aktivitäten, die überwacht werden, um ihre Arbeit zu erledigen. Diese Liste wird verwendet, um alle Aktivitäten zu koordinieren und sicherzustellen, dass bei der Verwaltung des Aktivitätsflusses alles reibungslos abläuft.

Es gibt einige Operationen, bei denen ich nicht genau untersucht habe, welche Thread- und Prozessprobleme koordiniert sind. Letztendlich, die ActivityResult verwendet eine native Operation - ActivityManagerNative.getDefault().startActivity() welches benutzt das Context dass du vorbeigekommen bist, als du angerufen hast startActivity. Der Kontext, den Sie übergeben haben, wird verwendet, um bei Bedarf die "Absichtslösung" zu unterstützen. Die Absichtsauflösung ist der Prozess, mit dem das System das Ziel der Absicht bestimmen kann, wenn es nicht geliefert wird. (Weitere Informationen finden Sie in der Anleitung hier).

Und damit Android dies tun kann, benötigt es Zugriff auf Informationen, die von Context. Insbesondere muss das System auf a zugreifen ContentResolver So kann es "den MIME-Typ der Daten der Absicht bestimmen". Das ganze über wie startActivity Die Verwendung des Kontexts war etwas kompliziert und ich verstehe die Interna selbst nicht vollständig. Mein Hauptanliegen bestand darin, zu veranschaulichen, wie auf anwendungsübergreifende Ressourcen zugegriffen werden muss, um viele der für eine App wichtigen Vorgänge auszuführen. Context bietet Zugriff auf diese Ressourcen.  Ein einfacheres Beispiel könnte Views sein. Wir wissen alle, wie Sie eine benutzerdefinierte Ansicht erstellen, indem Sie sie erweitern RelativeLayout oder etwas anderes View Klasse müssen Sie einen Konstruktor bereitstellen, der Context als ein Argument. Wenn Sie Ihre benutzerdefinierte Ansicht instanziieren, übergeben Sie den Kontext.  Warum? Weil die View Zugriff auf Designs, Ressourcen und andere Details zur View-Konfiguration haben muss. View-Konfiguration ist eigentlich ein großartiges Beispiel. Jeder Kontext hat verschiedene Parameter (Felder in ContextImplementierungen), die vom Betriebssystem selbst für Dinge wie die Dimension oder Dichte des Displays festgelegt werden. Es ist leicht einzusehen, warum diese Informationen zum Einrichten von Ansichten usw. wichtig sind.

Ein letztes Wort:  Aus irgendeinem Grund scheinen Android-Neulinge (und selbst Leute, die nicht so neu sind) die objektorientierte Programmierung von Android völlig zu vergessen. Aus irgendeinem Grund versuchen die Leute, ihre Android-Entwicklung zu vorgefassten Paradigmen oder erlernten Verhaltensweisen zu verbiegen.

Android hat sein eigenes Paradigma und ein bestimmtes Muster, das eigentlich ziemlich konsistent ist, wenn man seine vorgefassten Meinungen loslässt und einfach die Dokumentation und den Entwicklerführer liest. Mein wahrer Punkt jedoch, während "den richtigen Kontext zu finden", manchmal schwierig sein kann, werden Menschen in ungerechtfertigter Weise in Panik versetzt, weil sie in eine Situation geraten, in der sie den Kontext brauchen und denken, dass sie ihn nicht haben. Auch hier ist Java eine objektorientierte Sprache mit einem Vererbungsdesign.

Sie haben nur den Kontext innerhalb Ihrer Aktivität, weil Ihre Aktivität selbst von Kontext erbt. Es gibt keine Zauberei (abgesehen von all den Dingen, die das Betriebssystem selbst anstellt, um verschiedene Parameter einzustellen und Ihren Kontext korrekt zu "konfigurieren"). Also, Speicher / Performance-Probleme beiseite legen (zB Referenzen auf Kontext halten, wenn Sie nicht brauchen, oder dies in einer Weise tun, die negative Auswirkungen auf den Speicher usw. hat), Kontext ist ein Objekt wie jedes andere und es kann herumgereicht werden genau wie jedes POJO (Plain Old Java Object). Manchmal müssen Sie möglicherweise clevere Dinge tun, um diesen Kontext abzurufen, aber jede reguläre Java-Klasse, die sich von nichts anderem als dem Objekt selbst erstreckt, kann so geschrieben werden, dass sie auf den Kontext zugreifen kann. Legen Sie einfach eine öffentliche Methode offen, die einen Kontext verwendet, und verwenden Sie ihn dann in dieser Klasse nach Bedarf. Dies war nicht als erschöpfende Behandlung von Context- oder Android-Interna gedacht, aber ich hoffe, dass es hilfreich ist, Context ein wenig zu entmystifizieren.


255
2018-04-30 13:44



Ein Kontext ist ein Handle für das System; Es bietet Dienste wie das Auflösen von Ressourcen, den Zugriff auf Datenbanken und Voreinstellungen und so weiter. Kontext ist wie ein Handle für die Umgebung, in der Ihre Anwendung gerade ausgeführt wird. Das Aktivitätsobjekt erbt das Kontextobjekt.

Weitere Informationen finden Sie in Einführung in die Android-Entwicklung mit Android Studio - Tutorial.


100
2017-08-26 06:33



Solange du sowieso denkst, denke groß.

Schnittstelle zu globalen Informationen über eine Anwendungsumgebung. Dies ist eine abstrakte Klasse, deren Implementierung vom Android-System bereitgestellt wird.

Es ermöglicht den Zugriff auf anwendungsspezifische Ressourcen und Klassen sowie Aufrufe für Vorgänge auf Anwendungsebene, z. B. Starten von Aktivitäten, Senden und Empfangen von Absichten usw.

Activity diagram


64
2017-12-28 08:05



ANDROID UND KONTEXT

Wenn Sie die verschiedenen Android APIs durchsehen, werden Sie Beachten Sie, dass viele von ihnen eine nehmen android.content.Context Objekt als ein Parameter. Sie sehen auch, dass eine Aktivität oder ein Service normalerweise als verwendet wird Kontext. Dies funktioniert, weil diese beiden Klassen von Context ausgehen.

Was ist Kontext genau?

Laut der Android-Referenzdokumentation handelt es sich um eine Entität, die verschiedene Umgebungsdaten darstellt. Es bietet Zugriff auf lokale Dateien, Datenbanken, Klassenladeprogramme für die Umgebung, Dienste einschließlich Dienste auf Systemebene und vieles mehr. In diesem Buch und in Ihrer täglichen Arbeit Tags, die mit Android codieren, sehen Sie, dass der Kontext häufig weitergegeben wird. Von: "Android in der Praxis" Buch.


57
2018-04-28 10:14



Ein Android Kontext ist ein Schnittstelle Dies ermöglicht den Zugriff auf anwendungsspezifische Ressourcen und Klassen und Informationen über die Anwendungsumgebung.

Wenn deine Android-App eine Web-App war,   Dein Kontext wäre etwas   ähnlich ServletContext (Ich mache hier keinen genauen Vergleich)

Ihre Aktivitäten und Dienste erweitern auch den Kontext, damit sie alle Methoden erben, um auf die Umgebungsinformationen zuzugreifen, in denen die App ausgeführt wird.


36
2017-08-26 06:40