2014-02-27 2 views
11

서비스가 전경 서비스로 시작되고 활동이 표시되는 동안 알림을 숨기는 방법입니까?활동이 표시되는 동안 전경 서비스 알림 숨기기

음악 플레이어는 앱을 연 상태에서 알림 (버튼 포함)이 필요하지 않지만 음악 플레이어가 배경에있을 때마다 알림이 표시되어야한다고 생각하십시오.

포 그라운드에서 내 서비스를 실행하지 않으면 어떻게하는지 알 수 있습니다 ... 그러나 포 그라운드에서 실행하면 서비스 자체에 알림이 필요하고이를 보여 주므로 직접 알림을 관리 할 수 ​​없습니다. ...

어떻게 문제를 해결할 수 있습니까?

답변

10

이렇게 할 수 있습니다. 이 방법의 한 가지 필수 조건은 귀하의 활동이 서비스를 바인딩해야한다는 것입니다.

먼저 서비스 포 그라운드를 시작합니다.

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); 

, 그것에 영향을주지 않습니다.

+0

내가 원하는 것을하는 것처럼 보입니다 ... 단지 단점이 있습니다. 실제로 서비스를 시작하기 전에 서비스를 시작해야합니다 ... – prom85

+0

구현이 완료되었습니다. 그것은 잘 작동해야합니다. 대답이 업데이트되었습니다. –

+0

이전에 해봤지만 완벽하게 작동하지 않았습니다 ... 변경 사항을 확인하고 다시 한번 살펴 보겠습니다 ...그건 그렇고, 서비스를 바인딩하지 않고 ongoing/onResume 활동을 포스팅 상태로 바꾸는 것은 작동하지 않을 것입니다. 왜냐하면 활동이 활성화되어있을 때 서비스가 종료 될 수 있기 때문입니다. 이 일이 실제로 일어날 수 있습니까? 아니면 그게 효과가 있습니까? – prom85

2

를 사용하여 다음 단계를

1. 한 ActivityManager 현재 패키지 이름을 얻을 수 있습니다 (즉 활동 상단에 실행). 이 응용 프로그램이 아닌 경우는 응용 프로그램이 다음 알림

3.else을 표시하지 않습니다

2.check 경우 다음 알림을 표시.

ActivityManager manager =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
          List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1); 
          String topActivityName = tasks.get(0).topActivity.getPackageName(); 
          if(!(topActivityName.equalsIgnoreCase("your package name"))){ 
//enter notification code here 
}