2012-08-13 45 views
7

我正在创建一个显示当前播放歌曲notification的应用程序。如何取消意外/强制终止应用程序的通知

该歌曲正在播放通过Service &启动&取消通知是在服务本身完成的。

但是,如果应用程序被某种异常终止,或者如果我强制通过任务管理器关闭它,通知将保留在任务栏的顶部。

我该如何删除它。

下面是代码:

//In Service onStartCommand(), there is a call to initiatePlayback() 
private void initiatePlayback() { 
    try { 
     if (mPlayer.isPlaying()) { 
      mPlayer.stop(); 
     } 
     mPlayer.reset(); 
     mPlayer.setDataSource(currentData); 
     mPlayer.prepare(); 

     if (reqAudioFocus()) { 
      mPlayer.start(); 
     } 

     if (mPlayer.isPlaying()) { 
      initNotification(); 
     } 
    } catch (Exception e) { 
     Toast.makeText(this, 
       "PlayTrack->initiatePlayback(): " + e.toString(), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onDestroy() { 
    stopPlayback(); 
    mPlayer.release(); 
    mPlayer = null; 
    super.onDestroy(); 
} 

private void stopPlayback() { 
    if (mPlayer.isPlaying()) { 
     mPlayer.stop(); 
     mPlayer.reset(); 
     cancelNotification(); 
    } 
} 
private void cancelNotification() { 
     String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns); 
     mNotificationManager.cancel(NOTIFICATION_ID); 
    } 
+2

检查此: http://stackoverflow.com/questions/12997800/cancel-notification-on-remove-application-from-multitask-panel – 2014-03-13 23:51:03

回答

0

您可以覆盖onDestroy()方法和使用NotificationManager取消通知。您只需提供应取消通知的ID。

@Override 
public void onDestroy() { 

    private static final int MY_NOTIFICATION_ID= 1234; 
    String ns = Context.NOTIFICATION_SERVICE; 
    NotificationManager mNotificationManager; 
    mNotificationManager = (NotificationManager) getSystemService(ns); 
    mNotificationManager.notify(MY_NOTIFICATION_ID, notification); 
    //to cancel: 
    mNotificationManager.cancel(MY_NOTIFICATION_ID); 
} 
+0

对不起..未加载整个相关代码..做这个only..code added – reiley 2012-08-13 08:05:47

+0

@ raul8我的解决方案建议仍然适用于您的案例,因为您的应用程序在终止时会进入onDestroy状态,您可以简单地使用我共享的代码示例取消通知。你尝试过吗? – 2012-08-13 08:14:43

+3

是的..问题是OnDestroy甚至没有被调用。我正在使用'System'任务管理器。事情是其他球员甚至没有关闭,我认为这是一个正确的功能。所以现在我会尽量不要通过任务管理器强制关闭播放。 – reiley 2012-08-13 10:45:50

1

捕获异常和catch子句中取消:

mNotificationManager.cancel(MY_NOTIFICATION_ID); 
1

我知道这个问题是旧的,但我发现它时,我认为是有类似的问题。对我来说,服务与应用程序一起被杀害(它正确地取消了onDestroy中的通知),但随后被重新启动(与START_STICKY一样),并且通知再次被发布。在这些情况下,我不想让服务回来,直到用户从应用程序启动它,所以在OnStartCommand中,当传入的意图为空时,我调用stopSelf()。

0

你能赶上与打破你的应用程序中的错误:

Thread.setDefaultUncaughtExceptionHandler(newHandler); 

注意,这样做将无法申请到异常后关闭,所以你需要得到的是旧exceptionHandler的参考和从你叫它。

此外,添加代码以删除此方法的通知。