Различные экземпляры контекста приложения в Broadcastreceiver - PullRequest
8 голосов
/ 21 декабря 2010

Я хочу получить доступ к «глобальной» переменной в моем MyApp (расширяет приложение) из широковещательного приемника (зарегистрированного в манифесте) и, например, нескольких действий.Теперь у меня, кажется, есть разные экземпляры моего MyApp: один для BCR, а другой для действий.Может ли sb помочь мне с моей проблемой?большое спасибо Joerg

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Что я получаю из этого, так это то, что вы пытаетесь создать метод с одним объектом Context. Во-первых, для этого вам понадобится Singleton Pattern of MyApp для создания вашей «глобальной» переменной. Однако я бы посоветовал против этого по этим причинам:

  1. Различные компоненты приложения по умолчанию имеют разные контексты (база, приложение).
  2. BroadcastReceiver, определенный в манифесте, вызывается операционной системой, а не вашим приложением.
  3. Использование шаблона Singleton для объекта контекста приведет к очень неприятным зависимостям.
  4. Вы идете против дизайна и красоты Android Framework.

Я подозреваю, что причина, по которой вы это делаете, в том, что ваш класс MyApp может начинать различные действия. Это имеет смысл, но ... вы можете получить объект контекста практически из любого места. Многие вещи в Android расширяют класс ContextWrapper (например, объекты Java с классом Object). Так что на самом деле нет никаких причин когда-либо иметь «глобальный» экземпляр этого. Фактически, метод onReceive () вашего BroadcastReceiver принимает параметр контекста. Вы можете использовать это, чтобы начать деятельность, а что нет.

Если это не то, почему вы хотите использовать синглтон-класс MyApp - и для этого есть веские причины, я хотел бы взглянуть на реализацию , разработанную Биллом Пью , поскольку она наиболее безопасна в Java. синхронизация и блокировка потока аккаунта.

Надеюсь, это поможет. Помните, не боритесь с SDK, пусть он работает на вас!

0 голосов
/ 03 сентября 2012

У меня была похожая проблема, я смог получить доступ к объекту в упражнении, используя этот шаблон:

public class MyReceiver extends android.content.BroadcastReceiver {
    private Object _object;

    public MyReceiver(Someobject) {
        _object = the object;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Do something to the object.
    }
}

Затем позвоните MyReceiver(theobject) вместо new BroadcastReceiver().

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