Intereting Posts

Отправка трансляций из asynctasks

У меня есть asynctask, которая что-то делает, когда это делается, я хочу, чтобы она транслировала это.

Обычно я бы сделал: context.sendBroadcast(new Intent(MYINTENT)); Однако asynctask не имеет контекста. Я видел несколько ответов на эти вопросы, предлагая отправить ссылку на контекст активности приложения на асинтезу. Но эта ссылка плоха, если пользователь поворачивает экран. И ручное поддержание ссылки является плохим решением (требуется слишком много от активности, создающей асинтаску, которую я не контролирую). Теперь вопросы:

1) почему Android настроен так? Почему мне даже нужен контекст для отправки трансляции, когда трансляции могут быть зарегистрированы и обрабатываться другими контекстами?

2) есть ли хорошее решение этой проблемы? (Good = требуется как можно меньше от активности, создающей асинтаску, выживает вращение и т. Д.).

Контекст, который вы используете в своем AsyncTask прямо сейчас, является контекстом вашей текущей деятельности. По умолчанию поворот экрана уничтожит текущий экземпляр этой Activity и создаст новый. Это (даже если это может показаться не так сначала) предполагаемым поведением. Причина этого в том, что вы можете иметь разные ресурсы (макеты, чертежи и т. Д.) Для разных ориентаций экрана. Чтобы применить эти потенциально разные ресурсы, Android будет воссоздавать действие на каждом ротации.

Вы можете противодействовать этому, установив атрибут android:configChanges в ваш файл AndroidManifest.xml но в вашем случае это решение не рекомендуется.

Правильный способ решения этой проблемы – передать контекст приложения в AsyncTask вместо вашей активности (действие наследуется из Context ). Вы можете сделать это, вызвав getApplicationContext() из экземпляра вашей Activity. Контекст ваших приложений будет продолжать такие события, как поворот экрана и до тех пор, пока система не убьет приложение.

Почему вам нужен экземпляр Context для выполнения основных задач:

Интерфейс к глобальной информации о среде приложения. Это абстрактный класс, реализация которого обеспечивается системой Android. Он позволяет получить доступ к ресурсам и классам приложений, а также перехватам для операций на уровне приложений, таких как запуск, трансляция и получение намерений и т. Д.

Вот как официальная документация определяет Context . Может быть, кто-то может объяснить это лучше, но для себя это определение достаточно.