Intereting Posts
Ошибка FileProvider на устройствах Huawei Ffmpeg Build Output не отображается? Как я могу хранить структуру данных, такую ​​как Hashmap внутри Android? Ошибка Android в режиме слайд-активности Как печатать сообщения журнала в Android-каркасе Как проверить доступ к Интернету в настоящее время или нет в Android Часть-1 постоянная функция foreGround android, которая начинается с пользовательского интерфейса, также работает в спящем режиме, также начинается при перезагрузке телефона OnOptionsItemSelected не вызывается из подробного представления мастера фрагмента Передача TCP-сервера Android Как использовать getSystemService в классе без активности? Совместное использование временных файлов между приложениями без SD-карты Лучший способ быстро запустить тесты JUnit в Android-проекте в Android Studio OnAttach callback от фрагмента к активности Как управлять шириной вкладок навигации ActionBar? Сохранение открытых файлов во внутреннем хранилище

Как получить доступ к элементу TextView в BroadcastReceiver

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

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, и это не работает. Как я могу установить требуемый текст?

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

Update: Вот уродливый способ:

 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... }