Всем доброго времени суток.
Суть такая:
Есть сервис, он работает с моим сервером.
Когда от сервера приходит сообщение то сервис проверяет переменную 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);
}