이렇게 할 수 있습니다. 이 방법의 한 가지 필수 조건은 귀하의 활동이 서비스를 바인딩해야한다는 것입니다.
먼저 서비스 포 그라운드를 시작합니다.
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_ADJUST_WITH_ACTIVITY
플래그 외에 BIND_AUTO_CREATE
플래그를 지정하지 않으면 서비스가 자동으로 시작되지 않습니다.
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE
| BIND_ADJUST_WITH_ACTIVITY);
서비스가 자동 생성 플래그가 설정된 상태에서 시작되고 마지막 클라이언트가 바인딩을 해제하면 서비스가 자동으로 중지됩니다. 서비스를 계속 실행하려면 startService()
메소드로 시작해야합니다. 기본적으로 코드는 다음과 같습니다. 우리가 onCommand()
메소드를 오버라이드 (override)하지 않는 한 이미 시작 서비스에 대한 startService()
를 호출
Intent intent = new Intent(this, PlayerService.class);
startService(intent);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
, 그것에 영향을주지 않습니다.
내가 원하는 것을하는 것처럼 보입니다 ... 단지 단점이 있습니다. 실제로 서비스를 시작하기 전에 서비스를 시작해야합니다 ... – prom85
구현이 완료되었습니다. 그것은 잘 작동해야합니다. 대답이 업데이트되었습니다. –
이전에 해봤지만 완벽하게 작동하지 않았습니다 ... 변경 사항을 확인하고 다시 한번 살펴 보겠습니다 ...그건 그렇고, 서비스를 바인딩하지 않고 ongoing/onResume 활동을 포스팅 상태로 바꾸는 것은 작동하지 않을 것입니다. 왜냐하면 활동이 활성화되어있을 때 서비스가 종료 될 수 있기 때문입니다. 이 일이 실제로 일어날 수 있습니까? 아니면 그게 효과가 있습니까? – prom85