1114 Stimmen

Statischer Weg, um 'Context' in Android zu erhalten?

Gibt es eine Möglichkeit, die aktuelle Context Instanz innerhalb einer statischen Methode?

Ich bin auf der Suche nach dieser Möglichkeit, weil ich es hasse, die Instanz "Context" jedes Mal zu speichern, wenn sie sich ändert.

4voto

Kognos Punkte 57

Ich denke, Sie brauchen einen Körper für die getAppContext() Methode:

public static Context getAppContext()
   return MyApplication.context;

2voto

payne Punkte 3480

Die Antwort von Rohit scheint richtig zu sein. Beachten Sie jedoch, dass AndroidStudios "Instant Run" davon abhängt, dass Sie keine static Context Attribute in Ihrem Code, soweit ich weiß.

2voto

Bamaco Punkte 572

Ich verwende eine Variation des Singleton-Designmusters, um mir dabei zu helfen.

import android.app.Activity;
import android.content.Context;

public class ApplicationContextSingleton {
    private static Activity gContext;

    public static void setContext( Activity activity) {
        gContext = activity;
    }

    public static Activity getActivity() {
        return gContext;
    }

    public static Context getContext() {
        return gContext;
    }
}

Ich rufe dann ApplicationContextSingleton.setContext( this ); in meinem activity.onCreate() y ApplicationContextSingleton.setContext( null ); en onDestroy() ;

2voto

Darius Punkte 5091

Ich habe gerade ein von jQuery inspiriertes Framework für Android mit dem Namen Dampf-API das die App-Entwicklung vereinfachen soll.

Die zentrale $ Fassadenklasse unterhält eine WeakReference (Link zu einem großartigen Java-Blogbeitrag von Ethan Nicholas) zum aktuellen Activity Kontext, den Sie durch Aufruf abrufen können:

$.act()

A WeakReference behält einen Verweis bei, ohne zu verhindern, dass die Garbage Collection das ursprüngliche Objekt zurückfordert, so dass Sie keine Probleme mit Speicherlecks haben sollten.

Der Nachteil ist natürlich, dass Sie das Risiko eingehen, dass $.act() könnte Null zurückgeben. Ich habe nicht über dieses Szenario noch aber gekommen, so ist es vielleicht nur ein minimales Risiko, erwähnenswert.

Sie können den Kontext auch manuell festlegen, wenn Sie nicht mit VaporActivity als Ihr Activity Klasse:

$.act(Activity);

Außerdem wird ein Großteil der Dampf-API Framework verwendet diesen gespeicherten Kontext von Haus aus, was bedeuten kann, dass Sie ihn nicht selbst speichern müssen, wenn Sie sich für die Verwendung des Frameworks entscheiden. Schauen Sie sich die Website für weitere Informationen und Muster.

Ich hoffe, das hilft :)

1voto

Sergey Trukhachev Punkte 400

Heute der richtige Weg zu haben context ist die Verwendung von Dependency Injection. Zum Beispiel kann man Hilt verwenden, um den Kontext an jeder Stelle zu injizieren, an der er benötigt wird. Nehmen wir an, man braucht context in einem Datenbankmanager, dann kann dies wie folgt gelöst werden:

Hilt in Gradle hinzufügen:

implementation "com.google.dagger:hilt-android:2.35"
kapt "com.google.dagger:hilt-android-compiler:2.35"

Definieren Sie die Anwendungsklasse mit @HiltAndroidApp Anmerkung (z.B. den Datenbankmanager einbinden):

@HiltAndroidApp
class MyApplication : Application() {

    @Inject
    lateinit var dbManager: DBManager

    override fun onCreate() {
        super.onCreate()
        dbManager.initDB()
    }
}

Definieren Sie den Datenbankmanager (lassen Sie ihn @Singleton zum Beispiel auch):

@Singleton
class DBManager @Inject constructor(
    @ApplicationContext private val context: Context
) {

    fun initDB() {
        // context is avaiable
        databaseInit(context)
    }
}

Und das war's. Die DBManager in der richtigen Weise auf den Kontext zugreifen kann, ohne dass Speicherlecks entstehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X