1097 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.

40voto

phnmnn Punkte 11833

Kotlin Weg :

Manifest:

<application android:name="MyApplication">

</application>

MeineAnwendung.kt

class MyApplication: Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    companion object {
        lateinit var instance: MyApplication
            private set
    }
}

Sie können dann auf die Immobilie über MyApplication.instance

33voto

gulchrider Punkte 4255

Das hängt davon ab, wofür Sie den Kontext verwenden. Ich kann mir zumindest einen Nachteil dieser Methode vorstellen:

Wenn Sie versuchen, eine AlertDialog con AlertDialog.Builder die Application Kontext wird nicht funktionieren. Ich glaube, Sie brauchen den Kontext für den aktuellen Activity ...

16voto

Khemraj Sharma Punkte 52006

Kotlin

open class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        mInstance = this
    }

    companion object {
        lateinit var mInstance: MyApp
        fun getContext(): Context? {
            return mInstance.applicationContext
        }
    }
}

und erhalten Kontext wie

MyApp.mInstance

oder

MyApp.getContext()

12voto

user605331 Punkte 3588

Wenn Sie offen sind für die Verwendung von RoboGuice können Sie den Kontext in jede beliebige Klasse injizieren lassen. Hier ein kleines Beispiel dafür, wie man es mit RoboGuice 2.0 (Beta 4 zum Zeitpunkt der Erstellung dieses Artikels) machen kann

import android.content.Context;
import android.os.Build;
import roboguice.inject.ContextSingleton;

import javax.inject.Inject;

@ContextSingleton
public class DataManager {
    @Inject
    public DataManager(Context context) {
            Properties properties = new Properties();
            properties.load(context.getResources().getAssets().open("data.properties"));
        } catch (IOException e) {
        }
    }
}

9voto

ungalcrys Punkte 4850

Ich habe das irgendwann einmal benutzt:

ActivityThread at = ActivityThread.systemMain();
Context context = at.getSystemContext();

Dies ist ein gültiger Kontext, den ich beim Erhalt von Systemdiensten verwendet habe und der funktioniert.

Ich habe es jedoch nur bei Rahmen-/Basisänderungen verwendet und nicht in Android-Anwendungen ausprobiert.

A Warnung die Sie kennen müssen: Wenn Sie sich mit diesem Kontext für Rundfunkempfänger anmelden, wird dies nicht funktionieren und Sie werden eine Meldung erhalten:

java.lang.SecurityException: Das angegebene Aufruferpaket Android läuft nicht im Prozess ProcessRecord

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