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 を使用する必要があるため)、通知が再度投稿されていました。これらのケースでは、ユーザーがアプリからサービスを開始するまでサービスが戻ってこないようにしたかったので、受信インテントが null のときに 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 に答える