Вы пытаетесь работать с составной частью макета изнутри службы, но вы можете работать только с макетом из связанной деятельности. Служба не знает, находится ли активность на вершине, когда она выполняет свой код - экземпляр Activity может еще даже не существовать.
Наилучшим подходом к разрешению службы на обновление дисплея является передача намерения от службы:
Intent intent = new Intent();
intent.setAction("my.intent.action.name");
sendBroadcast(intent);
Затем в своей деятельности вы создаете экземпляр BroadcastReceiver для обработки намерения.
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("my.intent.action.name")) {
// do something with the UI here
}
}
};
Вам также необходимо зарегистрировать приемник вещания в методе onResume ():
IntentFilter filter = new IntentFilter("my.intent.action.name");
registerReceiver(receiver, filter);
И отмените регистрацию в вашем методе onPause ():
unregisterReceiver(receiver);
Вы не можете использовать статический внутренний класс для своего экземпляра BroadcastReceiver, потому что он не сможет делать такие вещи, как:
MyActivity.this.getContext()
или
MyActivity.this.findViewById(R.id.my_ui_component)
Надеюсь, это поможет!