OMGcoder
@OMGcoder
Начинающий java программист

Как сервису отслеживать привязку активностей?

Всем доброго времени суток.

Суть такая:
Есть сервис, он работает с моим сервером.

Когда от сервера приходит сообщение то сервис проверяет переменную boolean isBound;
Если тру - есть подписанная на сервис активность и сервис отправляет бродкаст
Если фолс - активностей подписанных нет , сервис делает нотификейшн.

Когда активность переходит в onStop() то в теле метода происходит отвязка от сервиса.
Когда активность переходит в onResume() - привязка к сервису.

Сам сервис запущен методом startService() при запуске программы в App классе.

И так подошли к проблеме.
Когда сервис работает и активность на него подписана - всё нормально.

Нажимаю на кнопку home и идёт отвязка от сервиса.
Первый раз отвязка проходит успешно.
В сервисе вызывается метод onUnBind();

Открываю активность - идёт привязка.
Должен вызываться метод onBind() но вызова нет.
В логах нету записи с вызовом метода OnBind() с сервиса.

И потом при открытии активности так же нету вызова OnBind()

Документацию перечитал. Сижу, думаю.

Почему так и что я мог сделать не правильно?
Согласно моей логике при первой привязке в сервисе должен сработать onBind(), при отвязке onUnBind(), при повторной привязке onReBind() но они молчат.

Суть задумки - дать сервису понять, что он должен делать, а именно бродкаст или нотификацию.

Очень важно, что бы при состоянии активности onResume() сервис делал только бродкасты, а когда активность в onStop() или вообще не существует то была нотификация.

Далее фрагменты кода активности.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }


//Начало метода init()
    private void init() {
        viewModel = ViewModelProviders.of(this).get(MainViewModel.class);

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d(DebugUtils.TAG, "onReceive: ");
                Message message = (Message) intent.getExtras().getSerializable(App.MESSAGE_EXTRA);
                outputText.setText(message.toString());
            }
        };


        intentFilter = new IntentFilter(App.ACTION_MESSAGE_RECEIVED);

        serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.d(DebugUtils.TAG, "onServiceConnected: ");

                registerReceiver(receiver, intentFilter);

                ServiceBinder binder = (ServiceBinder) service;
                mService = (MessageService) binder.getService();
                isBound= true;
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.d(DebugUtils.TAG, "onServiceDisconnected: ");
                unregisterReceiver(receiver);

                isBound = false;
            }
        };

        messageEdit = findViewById(R.id.message_editText);
        outputText = findViewById(R.id.output_textview);
        loadingProgress = findViewById(R.id.loading_progress);
        loadButton = findViewById(R.id.load_button);
    }
//Конец метода init()

@Override
    protected void onResume() {
        super.onResume();

        Intent intent = new Intent(this, MessageService.class);

        startService(intent);
        bindService(intent, serviceConnection, 0);
        Log.d(DebugUtils.TAG, "Activity: onResume: service binded");
    }


 @Override
    protected void onStop() {
        super.onStop();
        Log.d(DebugUtils.TAG, "Activity: onStop: service unbinded");
        unbindService(serviceConnection);
    }
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Dmtm
Android
лучше использовать ActivityLifecycleCallbacks
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы