Как получать данные о обновлении файла из кастомного сервиса?
Всем примет. У меня есть сервис, который запускается в бродкаст ресивере по мере получения бродкаст ресивером данных, и выполняет запись данных в файл. Далее, я хотел бы выводить данные из файла списком на главный экран, в мэйн активити. Однако, надо что бы данные по мере обновления файла обновлялись автоматически. Как мне это реализовать? Знаю, что надо коннектиться к сервису через IBinder, но как передавать данные немного не понимаю. Наверное надо какой то лиснер делать, помогите пожалуйста. Ниже код:
Мой биндер в сервисе.
override fun onBind(intent: Intent?): IBinder = bindService
inner class BindService : Binder() {
fun getService(): BroadcastService = this@BroadcastService
}
Коннект к сервису из MainActivity:
val bindService = object: ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
service as BroadcastService.BindService
val a = service.getService()
Log.i("FFFF", "YES")
}
override fun onServiceDisconnected(name: ComponentName?) {
TODO("Not yet implemented")
}
}
bindService(Intent(this, BroadcastService::class.java), bindService, Context.BIND_AUTO_CREATE)
Получается, что биндер при старте активити один раз отрабатывает, а при дальнейшем срабатывании сервиса он уже не отрабатывает. Как сделать верно?
Ответы (1 шт):
Делаете в activity приёмник. В методе onCreate
BroadcastReceiver service1;
IntentFilter filter1 = new IntentFilter();
filter1.addAction("SN_2_XR");
service1 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("SN_2_XR")) {
try {
// здесь ваш код обработки сигнала
_type_fuel_SN = intent.getStringExtra("type_fuel");
_remaining_fuel_SN = intent.getIntExtra("ost_fuel", 0);
_remaining_km_SN = intent.getStringExtra("ost_km");
_task_SN = intent.getIntExtra("task", 0);
_average_fuel_SN = (double) (intent.getIntExtra("sr_average", 0));
} catch (NullPointerException e) {
}
}
}
};
registerReceiver(service1, filter1);
И посылка интента из service. Пишите интент там, гже вы получили новые данные
static void send_can_pro(Context context) {
Intent in2 = new Intent("SN_2_XR");
in2.putExtra("sr_average", (int) (_sr_rashod_mainfuel*10));
in2.putExtra("type_fuel", _type_fuel_main);
in2.putExtra("ost_km", _stock_vid);
in2.putExtra("ost_fuel", (int)_main_tank_res);
in2.putExtra("task", _event_now_MS);
context.sendBroadcast(in2);
}