Я работаю над Android-приложением, в котором есть несколько действий. В нем у меня есть класс с несколькими статическими методами. Я хотел бы иметь возможность вызывать эти методы из разных видов деятельности. Я использую статические методы для загрузки данных из XML файла через XmlResourceParser. Для создания XmlResourceParser требуется вызов контекста приложения. Поэтому мой вопрос: какой лучший способ получить ссылку на контекст приложения в статические методы? Получают ли каждое действие его и передают? Хранить как-то в глобальной переменной?
Лучший способ получить контекст приложения в статический метод в Android
Ответ 1
Лучше всего передать объект Activity в качестве параметра статическим функциям.
AFAIK нет такого метода, который даст вам контекст приложения в статическом методе.
Ответ 2
Я не уверен, что это будет работать все время, но теперь это работает для меня:
public class myActivity extends ListActivity
{
public static Context baseContext;
public void onCreate(Bundle savedInstanceState)
{
baseContext = getBaseContext();
}
Затем вы можете использовать статику в своем пакете:
myApplication.baseContext
Ответ 3
Там есть сообщение в блоге Sane Tricks For InsaneWorld с ответом. В нем говорится, что вы можете заменить объект приложения своим собственным подклассом, а затем статически поддерживать контекст приложения. Вы можете найти пример кода в сообщении.
Оригинальное сообщение в блоге - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html
Ответ 4
Это позволит вам получить доступ к 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"
>
Пожалуйста, дайте мне знать, если вы видите что-то не так, спасибо.:)