Как получить доступ к элементу TextView в BroadcastReceiver - PullRequest
4 голосов
/ 16 января 2011

Я тестирую простой виджет в Android и использую сигналы тревоги для обновления TextView через равные промежутки времени. Проблема заключается в том, что в классе BroadcastReceiver я не могу получить доступ к элементу TextView, который я хочу обновить по истечении срока действия тревоги. Класс вызывается правильно, потому что тост, который я положил туда, дает соответствующее сообщение. Следующий код из класса, где я настраиваю виджет и устанавливаю таймеры.

 public void onCreate(Bundle bundle) {
     super.onCreate(bundle);

     Intent intent = getIntent();
     Bundle extras = intent.getExtras();
     if(extras != null){
      mWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(WidgetConfigure.this);
      RemoteViews views = new RemoteViews(WidgetConfigure.this.getPackageName(), R.layout.widget_layout);
      views.setTextViewText(R.id.quote, "Widget Loaded From Activity");
      appWidgetManager.updateAppWidget(mWidgetId, views);

      setTimer(); //set the timers...
      setResult();// set the result...
     }
 }

Теперь я хочу обновить тот же TextView, когда BroadCastReceiver вызывается после истечения таймера. Я пробовал код, представленный в примере ExampleAppWidget, представленном в демоверсиях Android Api, и это не работает. Как я могу установить необходимый текст?

1 Ответ

11 голосов
/ 17 января 2011

Вы не можете напрямую изменить что-либо в Деятельности из BroadcastReceiver.Потому что, когда вызывается широковещательный приемник, активность может не существовать.Вы можете отправлять сообщения в действие (если действие существует), или, если действие не существует, вы можете запустить его и поставить некоторые флажки в Обновление Intent

: вот такой уродливый способ:

class YourActivity extends xxxx {
   private static YourActivity mInst;

   public static YOurActivity instance() {
             return mInst;
   }

   /// Do your task here.
   public void setViewText(xxxx) ;

   @Override
   public void onStart() {
     ...
     mInst = this;
   }

   @Override
   public void onStop() {
     ...
     mInst = null;
   }
}

А в вашем BroadcastReceiver:

   YOurActivity inst = YOurActivity.instance();
   if(inst != null)  { // your activity can be seen, and you can update it's context 
       inst.setViewText...
   }
...