无法销毁活动IllegalStateException

时间:2013-11-11 18:48:00

标签: android android-service android-mediaplayer illegalstateexception ondestroy

我在Android中创建了一个媒体播放器,其中MediaPlayer在服务上。 我的主要活动有一个选项菜单,单项“exit”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

任何人都可以帮助我吗?感谢

3 个答案:

答案 0 :(得分:1)

不要调用onDestroy(),而是试试这个:

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

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

finish()会破坏Activity。但是你无法确定是否会调用onDestroy()!系统可以在任何时候销毁一个Activity,就像在低内存情况下一样,并且不会调用onDestroy()。

肯定会被调用的最后一个回调是onPause()。因此,将您的代码移出onDestroy()是安全的。

答案 1 :(得分: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();
        }

    }

答案 2 :(得分:0)

这不是一个完美的方法,但即使这不是一个好的做法,IllegalStateException可以避免这种方式。 (使用史蒂夫的上述解决方案)

因为至少要调用onDestroy()。 (如此图片所示:Activity lifecycle.

您的活动当时几乎已完成或已完成。 finish()

所以要在没有onDestroy()的情况下使用IllegalStateException方法,您必须这样做:

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