1

MediaPlayer がサービス上にある Android でメディア プレーヤーを作成しました。私のメインアクティビティには、単一項目「終了」のオプションメニューがありますonOptionsItemSelectedは別のメソッドを呼び出します(mpはサービス中のMediaPlayerのインスタンスです)

private void exitPlayer() {
        PlayerService.mp.stop();
        onDestroy();
    }

onDestroy メソッドはシンプルです

protected void onDestroy() {
        super.onDestroy();
        if (!PlayerService.mp.isPlaying()) {
            stopService(playerService);
            cancelNotification();
            finish();
        }   
    }

しかし、それは投げます

java.lang.RuntimeException: アクティビティを破棄できません java.lang.IllegalStateException

誰でも私を助けることができますか?ありがとう

4

3 に答える 3

1

onDestroy() を呼び出す代わりに、これを試してください。

private void exitPlayer() {
     PlayerService.mp.stop();
     exitAll();
}

private void exitAll() {
    if (!PlayerService.mp.isPlaying()) {
        stopService(playerService);
        cancelNotification();
        finish();
}

finish() はアクティビティを破棄します。しかし、確実に onDestroy() が呼び出されるとは限りません! システムは、メモリ不足の状況などでいつでもアクティビティを破棄でき、onDestroy() は呼び出されません。

確実に呼び出される最後のコールバックは onPause() です。したがって、安全のためにコードを onDestroy() の外に移動してください。

于 2013-11-11T19:21:02.517 に答える
0

そんなばかげた間違いはありません.finish()はonDestroy()を再度呼び出しますので、コードを次のように簡単に変更する必要がありました:

private void exitPlayer() {
        if(PlayerService.mp.isPlaying())
        PlayerService.mp.stop();
        finish();
    }
protected void onDestroy() {
        super.onDestroy();
        if (!PlayerService.mp.isPlaying()) {
            stopService(playerService);
            cancelNotification();
        }

    }
于 2013-11-11T19:16:42.617 に答える