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);
    }
4

4 回答 4

1

我知道这个问题很老,但是当我认为有类似问题时我发现了它。结果对我来说,该服务与应用程序一起被杀死(它正确地取消了 onDestroy 中的通知),但随后被重新启动(应该使用 START_STICKY)并再次发布通知。在这些情况下,我不希望服务在用户从应用程序启动它之前返回,因此在 OnStartCommand 中,当传入意图为空时,我调用了 stopSelf()。

于 2015-04-08T17:46:56.420 回答
1

捕获异常并在catch子句中取消它:

mNotificationManager.cancel(MY_NOTIFICATION_ID);
于 2012-08-13T07:58:03.433 回答
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);
}
于 2012-08-13T07:49:03.530 回答
0

您可以通过以下方式捕获破坏应用程序的错误:

Thread.setDefaultUncaughtExceptionHandler(newHandler);

请注意,这样做将无法在出现异常后关闭您的应用程序,因此您需要获取旧的 exceptionHandler 引用并从您的引用中调用它。

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

于 2015-04-08T18:02:29.080 回答