Подтвердить что ты не робот

Лучший способ получить контекст приложения в статический метод в Android

Я работаю над Android-приложением, в котором есть несколько действий. В нем у меня есть класс с несколькими статическими методами. Я хотел бы иметь возможность вызывать эти методы из разных видов деятельности. Я использую статические методы для загрузки данных из XML файла через XmlResourceParser. Для создания XmlResourceParser требуется вызов контекста приложения. Поэтому мой вопрос: какой лучший способ получить ссылку на контекст приложения в статические методы? Получают ли каждое действие его и передают? Хранить как-то в глобальной переменной?

4b9b3361

Ответ 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"
    >

Пожалуйста, дайте мне знать, если вы видите что-то не так, спасибо.:)