2011-11-17 4 views
3

현재 소리를 재생할 앱을 제작 중입니다. 사용자가 소리를 내면 다음 코드로 상태 표시 줄 알림을 표시합니다.Android : 애플리케이션 종료 수신

 
notificationManager = (NotificationManager) activity.getSystemService(Activity.NOTIFICATION_SERVICE); 

Intent intent = new Intent(activity, MyActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, intent, 0); 

notification = new Notification(); 
notification.icon = android.R.drawable.stat_notify_sync; 
notification.flags |= Notification.FLAG_ONGOING_EVENT; 

String title = activity.getString(R.string.notification_title); 
String text = activity.getString(R.string.notification_text); 

notification.setLatestEventInfo(activity, title, text, pendingIntent); 

괜찮습니다. 나중에 사용자가 모든 소리를 중단하면 notificationManager.cancel을 사용하여 알림을 제거하고 다시 정상적으로 작동합니다.

내 문제는 내가 작업 킬러 애플 리케이션을 사용하는 사람의 사건을 처리하고 싶다는 것입니다. 누군가 내 앱을 죽이기 위해 하나를 사용한다면 상태 표시 줄에서 알림 아이콘을 제거하고 싶습니다. 나는 많은 사용자들이 그런 종류의 앱을 사용하기를 좋아하고 어떤 사람들은 내 앱을 "닫을"수 없다고 불평하기를 원치 않는다.

지금까지 앱이 종료 될 때를 감지하지 못했습니다.

 
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() 
{ 
    @Override 
    public void uncaughtException(Thread thread, Throwable ex) 
    { 
    notificationManager.cancel(NOTIFICATION_ID); 
    } 
}); 

을 그리고이 : 나는 이것을 시도했습니다

 
Runtime.getRuntime().addShutdownHook(new Thread() 
{ 
    @Override 
    public void run() 
    { 
    notificationManager.cancel(NOTIFICATION_ID);    
    } 
}); 

하지만이 작동하지 않습니다. 내 앱이 죽으면 알림 아이콘이 계속 표시됩니다. 내 응용 프로그램을 죽이려면 "Advanced Task Killer"라는 응용 프로그램을 사용하고 있습니다. 또한 DDMS 내에서 프로세스를 종료하여 테스트했습니다.

나는 네이티브 미디어 플레이어가 그렇게하고 있다는 것을 알아 냈습니다. 음악이 재생되고 음악 서비스를 종료하면 아이콘이 사라집니다.

그래서 알림 아이콘을 제거 할 수 있도록 응용 프로그램을 종료하려고 할 때를 감지하는 방법이 있습니까? 아니면 내 앱이 죽으면 알림 아이콘이 자동으로 제거되는 방법이 있습니까?

감사합니다.

+0

귀하의 응용 프로그램은 알림을 관리 할 수 ​​있습니다 (다만 단어 "문서"를 클릭). 응용 프로그램이 종료되면 더 이상 아무것도 실행하지 않습니다. 'application.onTerminate()'와 같은 것이 호출되지 않습니다. 서비스를 즉시 다시 시작한 다음 알림을 관리하거나 알림을 플래그로 표시하여 응용 프로그램이 더 이상 실행되지 않을 때 시스템에서 제거하도록하는 방법을 찾아야합니다. –

답변

2

알림 표시 줄에 나타나는 아이콘의 두 가지 유형이 있습니다 :

당신은 첫 번째 유형을 사용하는 응용 프로그램이나 시스템에 의해 전송

  1. 알림,
  2. 전경 서비스
  3. 가 . 이것은 응용 프로그램 (또는 시스템)에서 보낸 알림이며 사용자에게 일부 정보를 제공하는 것이 목표입니다. 예 : 새 메일 도착, 저장 공간 부족, 내 게시물에 대한 새 설명 이것은 이론적으로 사용자가 확인하기를 원하는 모든 정보이며 사용자가 세부 정보를 볼 수있을 때까지 거기에 머물러 있어야하며 왼쪽에있는 모든 알림을 제거하기로 결정할 때까지 거기에 있어야합니다.

    는 나는 documentation

    전경 서비스에서 인용 전경 서비스에 대한 이야기를 시작하겠습니다

    는 사용자가 따라서 시스템의 후보가 없다는 적극적으로 인식하고 무언가로 간주하는 서비스입니다 메모리가 부족할 때 을 누르면 죽습니다. 포어 그라운드 서비스는 진행중인 제목 아래에있는 상태 표시 줄에 대해 알림을 제공해야합니다. 즉, 서비스가 중지되거나 포그 라운드에서 제거되지 않으면 알림을 닫을 수 없습니다.

    예를 들어 서비스에서 음악을 재생하는 음악 플레이어는 사용자가 명시 적으로 의 작업을 인식하고 있으므로 전경에서 실행하도록 설정된 이어야합니다. 상태 표시 줄의 알림은 현재 노래 인 을 나타내며 사용자가 음악 플레이어 과 상호 작용하는 활동을 시작할 수 있습니다.

    귀하의 질문에서 언급 한 뮤직 앱의 경우입니다. 뮤직 앱 내부의 플레이어 부분은 포 그라운드 서비스로 구현됩니다. 사용자가 노래를 선택하여 앱 UI를 통해 서비스를 시작하면 알림 표시 줄에 아이콘이 표시되고 노래 재생이 시작되고 UI 자체와 독립적으로 계속 진행될 수 있습니다. 노래가 끝나거나 사용자가 재생을 멈 추면 아이콘이 서비스가 중지되어야 할 때 사라집니다.

    는 포 그라운드 서비스를 구현하는 방법에 대한 자세한 내용은 위의 링크를 참조 그 실행하는 동안

+0

그래, 올바른 접근 방식은 전경 서비스와 함께가는 것 같습니다. 나는 오늘 이것을 시도 할 것이다. –

+0

내가 어떻게되는지 알자. – DallaRosa

+0

마침내 시도해 볼 수 있었고 제대로 작동했다. 그것은 올바른 접근 방법 인 것 같습니다. 감사! –

0

당신의 단 하나의 희망은 onPause()에서 모든 것을 수행하는 것입니다.^실제로^저장할 필요가 있습니다. 백그라운드 스레드의 유형에서 쉽게 수행 할 수 있습니다. 워드 프로세서 그냥 모든 읽습니다) 및 유일한 "해결 방법"나는 모든 것을 실행하는 방법에 대한 그림을 저장할 수 있습니다^그것을 실행하는 동안^서비스를 사용하여 확인하고 null이 아닌 값에 대한 확인^모든 곳^onResume()에서 해당 그래서 당신은 응용 프로그램 세미 안정된 상태에서 적어도 응용 프로그램을 반환 사용자에게 다음 (단지 운영 체제에서 작업 목록에서 포인터를 제거하여) 덤프받을 않는 경우

Dianne Hackborn, a Software Engineer who sits very near the exact center of everything Android.

2

가장 좋은 내기 이것을 Service으로 옮겨야합니다. onBind()에서 Service을 주 Activity에 연결할 수 있으며 앱이 종료되면 NotificationonUnbind 또는 onDestroy (Service) 중 하나에서 삭제할 수 있습니다.

+0

알림을 추가하거나 제거 할 필요가 없습니다. 포 그라운드 서비스를 만들면 서비스가 시작될 때 서비스 아이콘이 자동으로 나타나고 서비스가 중지되면 사라집니다. – DallaRosa

관련 문제