我正在创建一个显示当前播放歌曲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);
}
答案 0 :(得分:1)
抓住异常并在catch
子句中取消它:
mNotificationManager.cancel(MY_NOTIFICATION_ID);
答案 1 :(得分:1)
我知道这个问题已经过时了,但是当我认为遇到类似的问题时,我发现了这个问题。对我而言,该服务与应用程序一起被杀死(正确取消了onDestroy中的通知),但之后正在重新启动(因为它应该使用START_STICKY)并且通知再次发布。在这些情况下,我不希望服务返回,直到用户从应用程序启动它,因此在OnStartCommand中,当传入的intent为null时,我调用了stopSelf()。
答案 2 :(得分: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);
}
答案 3 :(得分:0)
您可以通过以下方式捕获破坏应用程序的错误:
Thread.setDefaultUncaughtExceptionHandler(newHandler);
请注意,执行此操作后,您的应用程序无法在异常后关闭,因此您需要获取旧的exceptionHandler引用并从您的应用程序中调用它。
另外,添加代码以删除此方法的通知。