Ожидающее намерение Android — AppWidget не срабатывает

#android #android-widget

#Android #android-виджет

Вопрос:

У меня есть виджет приложения с кнопкой в его макете. При нажатии на кнопку запускается intent, который вызывает мой широковещательный приемник.

Это работает просто отлично, но иногда, после использования кнопки «Очистить память» в диспетчере задач, виджет застревает — нажатие на него ничего не делает. Но он все равно может получать обновления из моего приложения, если оно запущено.

Я не уверен, является ли тот факт, что ожидающее намерение не запущено, ошибкой очистки памяти или моей ошибкой. В любом случае, вот код:

Регистрация ожидающего намерения (метод onUpdate виджета приложения)

     Intent intent = new Intent(context, ServiceControl.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
    views.setOnClickPendingIntent(R.id.appwidgetbutton, pendingIntent);
 

а затем обновление виджетов с помощью представлений.

Вот объявление поставщика виджетов приложения:

 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="72dp"
android:minHeight="72dp"
android:initialLayout="@layout/appwidget"
android:updatePeriodMillis="0">
</appwidget-provider>
 

Я не хочу, чтобы система вызывала обновления виджета, я обновляю его только из самого моего приложения.

Итак, почему ожидающее намерение перестает срабатывать?

Заранее спасибо.

Комментарии:

1. Я понятия не имею, что делает «Очистить память», поскольку Android не имеет встроенного в ОС «диспетчера задач». На какой версии Android вы это тестируете?

2. Это 2.3.3, и я почти уверен, что этот «диспетчер задач» — нечто особенное для телефонов Samsung. Я протестировал и получил эту проблему на своем Samsung Galaxy S2 и на S1 моего отца, так что, возможно, это ошибка «Очистить память». Согласно приведенному мной коду, это не должно быть связано с тем, что я сделал что-то не так, верно?

3. Ваш код выглядит нормально. Единственный сценарий, в котором я вижу, как происходит ваше поведение, будет на Android 3.1 , если пользователь убьет ваше приложение с помощью task killer или экрана управления службами в настройках или что-то в этом роде. Затем ваше приложение переводится в состояние «остановлено» и не может получать широковещательные сообщения, пока пользователь вручную не запустит одно из ваших действий снова. «Очистить память» может быть некоторым вариантом убийцы задач, но я почти уверен, что правило no-more-broadcasts не вступало в силу до Android 3.1.

4. После того, как приложение перестанет получать трансляции, вы ДОЛЖНЫ удалить виджет, он больше никогда не будет получать трансляции (он никогда не будет получать МОИ трансляции. такие трансляции, как APPWIDGET_UPDATE, все еще принимаются). Но мне интересно, почему этого не происходит ни в каких других виджетах? Ни один другой виджет никогда не зависал, поэтому я все еще чувствую, что где-то это моя вина…

5. У меня также был пользователь, сообщивший об этой проблеме на своем Samsung Galaxy Note.

Ответ №1:

@Jong

@CommonsWare

Привет, ребята, я понял это. Если это проблема Android, получатель ВСЕГДА должен получать. Теперь как это обойти? Очевидно, что все виджеты работают, так что, должно быть, там было просто.

Я где-то читал SO (пытаясь найти парня), напоминая нам всем, что класс widget фактически расширяет BroadcastReceiver.

Итак, вы можете зарегистрировать виджет (в манифесте) для получения самих угроз. Таким образом, вся система автономна в экземпляре класса AppWidgetProvider .

Теперь для обратной связи с приложением вы можете в onReceive вызвать любой статический класс вашего приложения, и LocalBroadcastManager не подведет вас, если приложение активно. Если он не активен, ваши кнопки все равно должны запускать действия!

Если вам нужен код, я могу его подробно описать.