Я работаю над приложением для Android, которое имеет несколько действий. В нем у меня есть класс с несколькими статическими методами. Я хотел бы иметь возможность вызывать эти методы из разных действий. Я использую статические методы для загрузки данных из XML-файла через XmlResourceParser. Для создания XmlResourceParser требуется вызов контекста приложения. Итак, мой вопрос: как лучше всего получить ссылку на контекст приложения в статические методы? Каждое действие получило его и передало? Сохранить как-то в глобальной переменной?
Лучший способ получить контекст приложения в статическом методе в Android
Ответы (4)
Лучшим способом было бы передать объект Activity в качестве параметра статическим функциям.
Насколько я знаю, нет такого метода, который даст вам контекст приложения в статическом методе.
Я не уверен, что это будет работать все время, но сейчас это работает для меня:
public class myActivity extends ListActivity
{
public static Context baseContext;
public void onCreate(Bundle savedInstanceState)
{
baseContext = getBaseContext();
}
Затем вы можете использовать статику в своем пакете:
myApplication.baseContext
Это должно дать вам доступ к applicationContext
из любого места, что позволит вам получить applicationContext
из любого места, где его можно использовать; Toast
, getString()
, sharedPreferences
и т. д. Я использовал это, чтобы несколько раз получить applicationContext
внутри статических методов.
Синглтон:
package com.domain.packagename;
import android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
Инициализируйте Singleton в вашем подклассе Application
:
package com.domain.packagename;
import android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
Если я не ошибаюсь, это дает вам доступ к applicationContext везде, вызывайте его с помощью ApplicationContextSingleton.getInstance.getApplicationContext();
Вам не нужно очищать это в любой момент, так как когда приложение закрывается, это все равно происходит.
Не забудьте обновить AndroidManifest.xml
, чтобы использовать этот подкласс Application
:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.domain.packagename"
>
<application
android:allowBackup="true"
android:name=".mApplication" <!-- This is the important line -->
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:icon="@drawable/app_icon"
>
Пожалуйста, дайте мне знать, если вы видите что-то не так, спасибо. :)
Application
, является хорошей идеей. Если нет, я должен передавать Context
в SingletonClass.getInstance(Context)
каждый раз, когда я его вызываю, и это действительно раздражает.
- person ProtossShuttle; 28.09.2015
Context
на Application
в типе поля, чтобы удалить это предупреждение.
- person Thomas; 18.01.2021
В блоге Sane Tricks For InsaneWorld есть сообщение с ответом. В нем говорится, что вы можете заменить объект приложения своим собственным подклассом, а затем статически сохранить контекст приложения. Вы можете найти пример кода в сообщении.
Исходный пост в блоге — http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html