2013-06-30 3 views
8

이메일을 보내는 서비스 (EmailService)를 만들었습니다 ... 내 앱으로 이메일을 보낼 때마다 서비스를 시작하고 의도를 통해 이메일의 ID를 전달합니다 ...startforeground를 여러 번 호출 하시겠습니까?

i startforeground(id_of_email, mynotifcation);을 사용하여 메일이 삭제되지 않도록하고 사용자에게 전자 메일 보내기 상태를 알리는 것이 좋습니다.

사용자가 다른 이메일을 보내야하는 경우 사용자가 다른 이메일을 보내야 할 때 새로운 의도 (다른 이메일 ID)로 startservice을 다시 호출하므로 ... startforeground(new_id_of_email, mynotifcation);을 다시 호출합니다. .

문제는 startforeground에 새 통화가 ... 이전 통지를 덮어 씁니다 (그래서 사용자가 이전 통지를 잃고 자신의 이전 이메일에 무슨 일이 일어나고 있는지 알지 못한다)을 Service.startForeground() 보면

+0

데이터베이스 또는 다른 작업을 대기열에 넣는 것이 더 좋지 않습니까? 그런 식으로, 첫 번째 작업이 완료되면 서비스가이를 완료하거나 삭제하고 다른 작업이 있는지 확인합니다. 서비스에 더 많은 작업을 계속 제공하는 메시지 대기열 일 수도 있습니다. – eduyayo

답변

2

이다 source는 startForeground를 여러 번 호출하면 현재 표시된 알림 만 바뀝니다. 실제로 startForeground에 대한 호출은 stopForeground()과 동일하며 removeNotification 만 항상 true로 설정됩니다.

서비스가 진행중인 각 이메일에 대한 알림을 표시하려면 서비스에서 개별적으로 각 알림을 관리해야합니다.

public final void startForeground(int id, Notification notification) { 
    try { 
     mActivityManager.setServiceForeground(
       new ComponentName(this, mClassName), mToken, id, 
       notification, true); 
    } catch (RemoteException ex) { 
    } 
} 

public final void stopForeground(boolean removeNotification) { 
    try { 
     mActivityManager.setServiceForeground(
       new ComponentName(this, mClassName), mToken, 0, 
       null, removeNotification); 
    } catch (RemoteException ex) { 
    } 
} 

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/Service.java#Service.startForeground%28int%2Candroid.app.Notification%29

0

한도 STOP_FOREGROUND_DETACH 플래그를 사용할 수 있습니다. stopForeground (INT)에 대한 API 레벨 24의 INT STOP_FOREGROUND_DETACH 플래그 첨가

STOP_FOREGROUND_DETACH

: 다음 documentation 인용

설정된 경우는, 상기 통지는 이전 startForeground 제공 (INT 통지) 서비스에서 분리됩니다. STOP_FOREGROUND_REMOVE가 설정되지 않은 경우에만 의미가 있습니다.이 의 경우 알림은 표시되지만 서비스에서 완전히 분리되어 이므로 통지 관리자에게 직접 호출 을 통하는 경우를 제외하고 더 이상 변경되지 않습니다.

상수 값 : 2 (0x00000002)

그래서, startForeground()에 반복 호출하기 전에 stopForeground(STOP_FOREGROUND_DETACH);를 호출 할 수 있습니다. 그러면 알림이 분리되고 다른 알림 ID를 사용하는 인 경우 에 대한 반복 호출 인 startForeground()으로 변경되지 않습니다.

또한 "분리 된"알림은 "진행중인 서비스"를 나타내지 않으므로 사용자가 스 와이프하여 제거 할 수 있습니다.

보너스 : here를 문서화로

의 호환성을 위해, 하나는 ServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH)ServiceCompat 클래스와 그 static 방법을 사용할 수 있습니다.

관련 문제