Ответ 1
Вы можете сделать это так. Одним из предварительных условий этого метода является то, что ваша активность должна связывать службу.
Сначала вы начинаете работу переднего плана.
private Notification mNotification;
public void onCreate() {
...
startForeground(1, mNotification);
}
Затем в вашей деятельности вы связываете и отвязываете услугу, как показано ниже. BIND_ADJUST_WITH_ACTIVITY
важно для поддержания работоспособности в течение времени, когда оно связано с видимой деятельностью.
public void onStart() {
...
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
}
public void onStop() {
...
unbindService(mConnection);
}
Теперь вот последнее прошлое. Вы останавливаетесь на переднем плане, когда по крайней мере один клиент подключается к службе, и вы запускаете передний план, когда последний клиент отключается.
@Override
public void onRebind(Intent intent) {
stopForeground(true); // <- remove notification
}
@Override
public IBinder onBind(Intent intent) {
stopForeground(true); // <- remove notification
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
startForeground(1, mNotification); // <- show notification again
return true; // <- important to trigger future onRebind()
}
При привязке услуги вы должны учитывать правила, применяемые Android. Если вы связываете не запущенную службу, служба не запускается автоматически, если вы не укажете флаг BIND_AUTO_CREATE
в дополнение к значку BIND_ADJUST_WITH_ACTIVITY
.
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE
| BIND_ADJUST_WITH_ACTIVITY);
Если служба была запущена с включенным флагом автоматического создания, а последний клиент отключается, служба автоматически остановится. Если вы хотите сохранить работу, вы должны запустить ее с помощью метода startService()
. В принципе, ваш код будет выглядеть так, как показано ниже.
Intent intent = new Intent(this, PlayerService.class);
startService(intent);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
Вызов startService()
для уже запущенного сервиса не влияет на него, так как мы не переопределяем метод onCommand()
.