Как получать данные о обновлении файла из кастомного сервиса?

Всем примет. У меня есть сервис, который запускается в бродкаст ресивере по мере получения бродкаст ресивером данных, и выполняет запись данных в файл. Далее, я хотел бы выводить данные из файла списком на главный экран, в мэйн активити. Однако, надо что бы данные по мере обновления файла обновлялись автоматически. Как мне это реализовать? Знаю, что надо коннектиться к сервису через 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 шт):

Автор решения: Arty Morris

Делаете в 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);
}
→ Ссылка