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.
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.
Hier ist ein undokumentiert Weg zu einer Anmeldung (der ein Kontext ist) von einer beliebigen Stelle im UI-Thread. Sie stützt sich auf die versteckte statische Methode ActivityThread.currentApplication()
. Es sollte zumindest unter Android 4.x funktionieren.
try {
final Class<?> activityThreadClass =
Class.forName("android.app.ActivityThread");
final Method method = activityThreadClass.getMethod("currentApplication");
return (Application) method.invoke(null, (Object[]) null);
} catch (final ClassNotFoundException e) {
// handle exception
} catch (final NoSuchMethodException e) {
// handle exception
} catch (final IllegalArgumentException e) {
// handle exception
} catch (final IllegalAccessException e) {
// handle exception
} catch (final InvocationTargetException e) {
// handle exception
}
Beachten Sie, dass es möglich ist, dass diese Methode Null zurückgibt, z. B. wenn Sie die Methode außerhalb des UI-Threads aufrufen oder die Anwendung nicht an den Thread gebunden ist.
Es ist immer noch besser, die @RohitGhatol Lösung, wenn Sie den Anwendungscode ändern können.
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) {
}
}
}
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 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.