Обновление виджета приложения для Android - PullRequest
0 голосов
/ 15 марта 2011

Вот с чем я имею дело.

У меня есть виджет, связанный с моим Android-приложением, который я хочу обновлять каждые 10 минут (в настоящее время использующий AlarmManager), только если экран включен. Если экран выключен, аварийные сигналы для отложенного намерения отменяются. Как только экран снова включается, я проверяю, имеет ли разница между последним обновлением и текущим временем 10 минут или более, и отправляю ли я широковещательную рассылку для обновления виджета.

Что происходит, и проблема в том, что сигналы тревоги для ожидающего намерения, вероятно, не отменены (возможно), и обновление виджета выполняется для всех сигналов тревоги для ожидающего намерения, которые были сложены при выключенном экране.

Вот некоторые фрагменты кода.

@Override
public void onReceive(Context context, Intent intent) {
        check_intent = intent.getAction();

            if(check_intent.equals("android.appwidget.action.APPWIDGET_UPDATE")){

                 mAppPreferences = PreferenceManager.getDefaultSharedPreferences(context);
                 int saved_num_widgets = mAppPreferences.getInt(NUM_WIDGETS, 0);
        /*Check if there is atleast one widget on homescreen*/       
                 if (saved_num_widgets>0){
                        boolean check = CheckScreenOn.check_screen_on(context);
/*Check if Screen is ON*/
                            if(check == true){
                                                Intent widgetUpdate = new Intent(context, MyWidget.class);
                                                widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
                                                alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
                                                newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate,0);
                                                alarms.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+ PERIOD, newPending);
                                                context.startService(new Intent(context, UpdateService.class));
                            }
                            else{
                                alarms.cancel(newPending);
/*Screen is OFF no point updating the widget, cancel Alarms and do nothing*/
                            }
                     }
                     else{
                            int duration = Toast.LENGTH_LONG;
                            CharSequence text = "Please place My Widget on your home screen to keep earning money.";
                            Toast toast = Toast.makeText(context, text, duration);
                            toast.show();
                     }
                    }   
                if(check_intent.equals("android.appwidget.action.APPWIDGET_ENABLED")){
                    this.onEnabled(context);
                }
                if(check_intent.equals("android.appwidget.action.APPWIDGET_DELETED")){
                    this.onDeleted(context);
                }
                if(check_intent.equals("android.appwidget.action.APPWIDGET_DISABLED")){
                    this.onDisabled(context);
                }


    }

Вот BroadcastReceiver, который получает широковещательную рассылку SCREEN_ON и отправляет запрос на обновление виджета, если виджет времени в последний раз обновлялся> = 10 минут.

registerReceiver(new BroadcastReceiver() {

              @Override
              public void onReceive(Context context, Intent intent) {
                // ... 
                long update_interval = mAppPreferences.getLong(LASTUPDATETIME, 0);
                long curtimemillis = System.currentTimeMillis();
                long calculate_interval = curtimemillis - update_interval;
                if(calculate_interval >= PERIOD){
                    int saved_num_widgets = mAppPreferences.getInt(NUM_WIDGETS, 0);

                    if (saved_num_widgets>0){

                               alarms.cancel(newPending);
                            Intent widgetUpdate = new Intent(context, MyWidget.class);
                            widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
                            context.sendBroadcast(widgetUpdate);
                        }

                    }

                  }
                }, new IntentFilter(Intent.ACTION_SCREEN_ON));

Допустим, последнее обновление произошло в 10:00 и экран был выключен на 30 минут. Когда экран включается, виджет обновляется сразу для всех сигналов тревоги, сохраненных для pendingIntent. Я хочу, чтобы обновление виджета происходило только один раз, когда снова включается экран.

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

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

Кстати, я провел тесты производительности на 10-минутном обновлении виджета на различных устройствах, и это вовсе не нагрузка на доступные ресурсы. Более того, доставленная услуга даже не отображается на мониторе использования аккумулятора для устройств Android.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 15 марта 2011

Я тоже это видел. Изменил его, чтобы использовать широковещательный приемник, который получает SCREEN_OFF или SCREEN_ON и останавливает / запускает службу тревоги вручную.

Не тот ответ, которого вы, возможно, давно жалеете: -)

...