Лучший способ получить контекст приложения в статический метод в Android - PullRequest
31 голосов
/ 07 мая 2010

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

Ответы [ 4 ]

23 голосов
/ 07 мая 2010

Лучшим способом было бы передать объект Activity в качестве параметра статическим функциям.

AFAIK, не существует такого метода, который бы давал вам контекст приложения в статическом методе.

3 голосов
/ 29 октября 2010

Я не уверен, что это будет работать постоянно, но сейчас у меня работает:

public class myActivity extends ListActivity
{
    public static Context baseContext;

    public void onCreate(Bundle savedInstanceState) 
    {
        baseContext = getBaseContext();
    }

Тогда вы можете использовать статические в вашем пакете:

myApplication.baseContext
2 голосов
/ 25 сентября 2015

Это должно дать вам доступ к 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);
    }
}

Если я не ошибаюсь, это дает вам повод для приложенияContext везде, вызывайте его с помощью 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"
    >

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

1 голос
/ 13 апреля 2013

В блоге Sane Tricks For InsaneWorld есть сообщение с ответом. В нем говорится, что вы можете заменить объект Application своим собственным подклассом, а затем статически сохранить контекст приложения. Вы можете найти пример кода в сообщении.

Оригинальное сообщение в блоге - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...