Контекст Android во всем приложении

этот вопрос предназначен для того, чтобы спросить сообщество, верен ли подход, который я использовал для своего приложения, или может ли он иметь какой-либо побочный эффект:

Я создал: - Действие под названием MasterAcitity, расширенное от каждого действия в моем приложении. Тег приложения в манифесте объявлен следующим образом

<application
        android:name="my.package.name.MyApplication"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/ApplicationStyle" >
  • Класс MyApplication, расширяющий android.App.Application, имеет следующий код.

    private static Context _context;
    
    public static Context getContext() {
        return _context;
    }
    
    public static void setContext(Context context) {
        _context = context;
    }
    
  • В манифесте тег приложения объявлен следующим образом

    <application
        android:name="my.package.name.MyApplication"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/ApplicationStyle" >
    

MasterActivity выполняет этот код в методах OnResume и OnCreate.

MyApplication.setContext(this);

Каждое действие приложения расширяет MasterActivity.

В приложении есть класс DialogHelper со статическим методом.

public static void showDialog(String message)

который использует android.app.AlertDialog.Builder для создания и отображения диалогового окна с использованием контекста MyApplication.getContext()

так что из любого места в моем приложении я могу использовать

DialogHelper.showDialog("my message");

Будет ли этот подход работать? или мне нужно на что-то обратить внимание?

Я сомневаюсь в статическом контексте ...

Спасибо


person Apperside    schedule 04.05.2013    source источник
comment
вы можете использовать getaplicationcontext (). ты пробовал это?   -  person itsrajesh4uguys    schedule 04.05.2013
comment
при необходимости вы должны передать контекст. Это может вызвать утечку памяти.   -  person Anis BEN NSIR    schedule 04.05.2013
comment
@ itsrajesh4uguys, у меня есть классы со статическими методами, которые должны показывать диалоги. Анис, вы можете мне объяснить, почему это должно вызывать утечку памяти?   -  person Apperside    schedule 04.05.2013
comment
@SimonVeloper: у меня есть классы со статическими методами, которые должны показывать диалоги. Не интересно, что расширяют эти «классы»?   -  person Squonk    schedule 05.05.2013
comment
просто передайте контекст в качестве аргументов при доступе к этим классам   -  person itsrajesh4uguys    schedule 05.05.2013


Ответы (2)


Будет ли этот подход работать?

Использование Application для работы с пользовательским интерфейсом всегда вызывало проблемы. Либо используйте Activity, либо специализированный Context для данного набора обстоятельств (например, getThemedContext() на ActionBar, getContext() на Presentation).

person CommonsWare    schedule 04.05.2013
comment
Я согласен с вами, но я не понимаю, почему этот подход может вызвать некоторые проблемы. Чего я не понимаю, так это разницы в передаче контекста из текущего действия, вызывающего метод, и разрешения статическому методу showDialog принимать контекст, который всегда обновляется из каждого действия (к моменту, когда метод onCreate устанавливает контекст). Разве я не использую ту же контекстную ссылку? - person Apperside; 05.05.2013
comment
@SimonVeloper: На самом деле, ваш подход хуже, IMHO, чем то, о чем я думал. Я неправильно прочитал ваш пост и хотя, что Context, принадлежащий Application, был Application. Не помещайте другие Context объекты в статические элементы данных, так как вы рискуете утечкой памяти. Кроме того, для Dialog, поскольку они могут быть запущены только Activity, просто используйте this для Context. - person CommonsWare; 05.05.2013

У вас также должен быть обработчик onDestroy, который сбрасывает контекст до нуля, если контекст принадлежит уничтожаемой активности.

Вместо глобального статического контекста я бы предпочел такой api

 DialogHelper.showDialog(this.getContext(),"my message");

[Обновлено 5.5.2013]

Каждое действие, служба , BroadcastReceiver является косвенно полученным из контекста через ContextWrapper и другие классы, такие как Views, сохраняют и используют Context. они обычно раскрывают его через функцию getContext (). Таким образом, контекст должен быть доступен там, где это необходимо.

person k3b    schedule 04.05.2013
comment
Во-первых, BroadcastReceiver НЕ расширяет Context. Во-вторых, Activity, Service и BroadcastReceiver не имеют метода с именем getContext(). Наконец, зачем классу, который расширяет Context, нужен метод для получения экземпляра самого себя? Все, что расширяет Context, может просто использовать this для передачи Context экземпляра другому классу. - person Squonk; 05.05.2013
comment
вы правы в том, что BroadcastReceiver - это не контекст. Я обновил свой ответ и переформулировал последнюю часть, чтобы прояснить, что я имел в виду. - person k3b; 05.05.2013