Большинство приложений, которым нужен удобный метод для получения контекста приложения, создают свой собственный класс, который расширяет android.app.Application
.
GUIDE
Вы можете сделать это, сначала создав класс в своем проекте, как показано ниже:
import android.app.Application;
import android.content.Context;
public class App extends Application {
private static Application sApplication;
public static Application getApplication() {
return sApplication;
}
public static Context getContext() {
return getApplication().getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
}
}
Затем в вашем AndroidManifest вы должны указать имя вашего класса в теге AndroidManifest.xml:
<application
...
android:name="com.example.App" >
...
</application>
Затем вы можете получить контекст приложения любым статическим методом, используя следующее:
public static void someMethod() {
Context context = App.getContext();
}
ВНИМАНИЕ
Прежде чем добавить что-то подобное в ваш проект, вы должны рассмотреть то, что написано в документации:
Обычно нет необходимости создавать подкласс Application. В большинстве случаев
статические синглтоны могут обеспечивать такую же функциональность в более модульном
путь. Если ваш синглтон нуждается в глобальном контексте (например, для регистрации
приемники широковещания), функция для ее получения может быть
Контекст, который внутренне использует Context.getApplicationContext (), когда
Сначала строим синглтон.
ОТРАЖЕНИЕ
Существует также другой способ получить контекст приложения с помощью отражения. Отражение часто воспринимается в Android свысока, и я лично считаю, что его нельзя использовать в производстве
Чтобы получить контекст приложения, мы должны вызвать метод для скрытого класса ( ActivityThread ), который был доступен с API 1:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
}
Существует еще один скрытый класс ( AppGlobals ), который обеспечивает способ получения контекста приложения статическим способом. Он получает контекст, используя ActivityThread
, так что на самом деле нет разницы между следующим методом и тем, что опубликован выше:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);
}
Удачного кодирования!