5

파일을 업로드하는 IntentService가 있습니다. 모든 것은 정상적으로 작동하지만 알림을 처리하는 방법에 대해서는 약간 혼란 스럽습니다. 알림을 시작할 때 startForeground()을 사용합니다. 그 이유는 파일이 상당히 클 수 있기 때문이며 절대적으로 필요한 경우를 제외하고는 업로드를 원하지 않습니다. 내가 startForeground()를 사용하는 경우는 알림 영역에서 두 개의 통지 (알림에서 진행에서 하나 하나) 표시 : 나는 다른 스택 오버플로 게시물과 웹 문서의 수를 읽은startForegrounds 두 가지 알림을 올바르게 처리하는 방법

Example:

, 그러나 아무도 없다 그들은 내가 가지고있는 질문에 대답한다 ... 희망을 갖고 나는 ths에 관해 말하는 것을 놓치지 않았다.

위의 이미지 (진행률 표시 줄이없는 이미지)의 진행중인 알림은 전경 (Services documentation)에서 실행 중이므로 계속 표시됩니다. 당신이 저에게 묻는다면 그것은 모두 좋고 좋은 것이고, 나는 그 이유를 이해합니다. 그러나 두 개의 알림을 표시 할 필요가 없으며 대부분의 사람들이 알림 영역을 어지럽히는 두 가지 알림을 원하지 않을 것이라고 확신합니다. 알림을 적절하게 처리하여 알림 영역 만 표시하고 알림 영역이 복잡해지지 않도록하는 방법을 알고 싶습니다.

startForeground (int id, Notification notification) (아래 코드 내 ONGOING_NOTIFICATION_ID)의 정수 ID를 0으로 설정하면이 문제를 해결할 수있는 유일한 방법입니다. 그러나, 나는 위의 인용 문서는 말한다 : 0으로 설정

Caution: The integer ID you give to startForeground() must not be 0

가 진행 알림을 비활성화 한 후 바로 진행 표시 줄과 일반 통지를 보여줍니다. 파일 업로드가 완료 될 때까지 .setOngoing(true)을 설정하고 수정이 완료되면 .setOngoing(false)을 설정하여 문제를 해결할 수 있다고 생각합니다. 따라서 해지 할 수 있습니다. 정확하게 "신중한"사람이 정수 ID를 0으로 설정하는 것과 정확히 일치하지는 않습니다. 나에게이 문제는 내가 가지고있는 문제를 해결할 수있는 게으른 방법처럼 보입니다.하지만 그렇지 않습니다. 그것을 0으로 설정하는 다른 결과가 있는지 확인하십시오. 또한, 이것은 내가 다루고있는 하나의 알림 만있는 경우에만 작동합니다. 여러 개의 다른 알림이있는 경우 각 ID마다 다른 ID가 필요하며 작동하지 않습니다. 업데이트 : 마치 setting the ID to 0 won't work in Android 4.3처럼 보입니다. 이제 다시 정사각형으로 돌아갑니다.

알림을 표시하는 올바른 방법은 무엇입니까?

업데이트/솔루션 : 시간을내어 다시 돌아와서 @dsandler의 추천에 따라 수행 한 작업을 다시 확인하면 내가 잘못하고있는 작업을 파악하는 데 도움이되었습니다. 진행 업데이트를 할 때 올바른 ID를 설정하지 않아서 두 가지 알림을 만들고 업데이트되지 않은 것입니다. 모든 알림에 동일한 ID (ONGOING_NOTIFICATION_ID)를 사용하면 나를 위해이 문제가 해결되었습니다. 이전에 포함시키지 않은 부분과 실수 한 부분에 대해서는 아래 코드를 참조하십시오. UploadFile.java에서

관련 코드 :

public class UploadFile extends IntentService { 

    private static final int ONGOING_NOTIFICATION_ID = 1; 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mBuilder = new NotificationCompat.Builder(this); 
     mBuilder.setContentTitle(getText(R.string.upload)) 
      .setContentText("0% " + getText(R.string.upload_in_progress)) 
      .setSmallIcon(android.R.drawable.stat_sys_upload); 

     startForeground(ONGOING_NOTIFICATION_ID, mBuilder.build()); 


.... 

    if (progress > 0){ 
     percent = (Long.valueOf(progress) * 100)/totalSize; 
     mBuilder.setProgress(100, percent.intValue(), false); 
     mBuilder.setContentText(percent.intValue() + "% " + getText(R.string.upload_in_progress)); 
     mNotifyManager.notify(ONGOING_NOTIFICATION_ID, mBuilder.build()); // <-- My problem was that I had set the ID here to 0 and did not make it the same as the ID I set above 
    }      

.... 

} 

답변

1

이 먼저 떨어져, 당신의 묘사에 의해 판단, 당신은 메모리 부족 범인이 '원 것을 인식, 정기적으로 서비스를 벗어날 수있을 것 일이 무서워 지거나 서비스가 정말로 오랜 시간 실행되지 않는 한 전화하지 않습니다.

그렇다면 서비스를 포 그라운드로 만들어야하는 경우 일반적인 전략은 서비스를 포 그라운드 상태로 만들 때 사용한 알림을 사용하여 진행 상황을 표시하는 것입니다. NotificationManager.notify을 사용하면 예를 들어 Notification.Builder.setProgress을 통해 진행률 표시 줄 조정을 포함하여 원하는대로 해당 알림의 업데이트를 게시 할 수 있습니다.

이렇게하면 사용자에게 하나의 알림 만 표시되며 이는 startForeground에서 요구하는 알림입니다.

+0

감사합니다. 나는 돌아가서 내가하고 있었던 일 (당신이 조언 한 일을하고 있음)을 재확인하고 진행 상황을 게시 할 때 올바른 알림 ID를 사용하지 않는다는 것을 깨달았다. 그것은 매력처럼 지금 일하고있다! – Jason

+0

알림과 관련하여 질문이 있습니다. "setSmallIcon"에 대해 수행 한 것처럼 Android를 사용하려면 "setLargeIcon"에 어떤 아이콘을 사용해야합니까? –

+0

** NotificationManager.notify **가 필요한 이유는 무엇입니까? 'startForegroundService()'는 이미 알림을 보여줍니다. –

-1

startForeground()로 설정된 알림을 업데이트하려면 새 알림을 작성한 다음 NotificationManager를 사용하여 알립니다.

KEY 포인트는 동일한 알림 ID를 사용하는 것입니다.

나는 Notification을 업데이트하기 위해 startForeground()를 반복적으로 호출하는 시나리오를 테스트하지 않았지만, NotificationManager.notify를 사용하는 것이 더 좋을 것이라고 생각한다.

알림을 업데이트해도 전경 상태에서 서비스가 제거되지 않습니다 (이 작업은 stopForground를 호출해야만 가능합니다).

예 : 답변

private static final int notif_id=1; 

@Override 
public void onCreate(){ 
    this.startForeground(); 
} 

private void startForeground() { 
     startForeground(notif_id, getMyActivityNotification("")); 
} 

private Notification getMyActivityNotification(String text){ 
     // The PendingIntent to launch our activity if the user selects 
     // this notification 
     CharSequence title = getText(R.string.title_activity); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 
       0, new Intent(this, MyActivity.class), 0); 

     return new Notification.Builder(this) 
       .setContentTitle(title) 
       .setContentText(text) 
       .setSmallIcon(R.drawable.ic_launcher_b3) 
       .setContentIntent(contentIntent).getNotification();  
} 
/** 
this is the method that can be called to update the Notification 
*/ 
private void updateNotification() { 

       String text = "Some text that will update the notification"; 

       Notification notification = getMyActivityNotification(text); 

       NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
       mNotificationManager.notify(notif_id, notification); 
} 
관련 문제