Android 无法销毁活动非法状态异常

Android 无法销毁活动非法状态异常,android,android-service,android-mediaplayer,illegalstateexception,ondestroy,Android,Android Service,Android Mediaplayer,Illegalstateexception,Ondestroy,我已经在安卓系统中创建了一个媒体播放器,其中媒体播放器在服务上。 我的主要活动有一个选项菜单,其中只有一个选项“exit”onOptions ItemSelected调用另一个方法(mp是MediaPlayer的实例) 而无损检测方法简单 protected void onDestroy() { super.onDestroy(); if (!PlayerService.mp.isPlaying()) { stopService(playe

我已经在安卓系统中创建了一个媒体播放器,其中媒体播放器在服务上。 我的主要活动有一个选项菜单,其中只有一个选项“exit”onOptions ItemSelected调用另一个方法(mp是MediaPlayer的实例)

而无损检测方法简单

protected void onDestroy() {
        super.onDestroy();
        if (!PlayerService.mp.isPlaying()) {
            stopService(playerService);
            cancelNotification();
            finish();
        }   
    }
但它会抛出

java.lang.RuntimeException:无法销毁活动 java.lang.IllegalStateException


有人能帮我吗?谢谢

哦,别犯这么愚蠢的错误,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();
        }

    }

不要调用onDestroy(),请尝试以下操作:

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

private void exitAll() {
    if (!PlayerService.mp.isPlaying()) {
        stopService(playerService);
        cancelNotification();
        finish();
}
finish()将销毁该活动。但是您不能确定onDestroy()是否会被调用!在内存不足的情况下,系统可以随时销毁活动,并且不会调用onDestroy()


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

这不是一个完美的方法,但即使这不是一个好的做法,
非法状态例外
也可以通过这种方法避免。(使用上面Steve提供的解决方案)

因为至少调用了
ondestory()
。(如图所示:)

此时您的活动几乎完成或正在完成。通过
finish()

因此,要在没有非法状态异常的情况下使用
onDestroy()
方法,您必须这样做:

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

你永远不会直接调用onDestroy(),它非常重要,非法状态异常通常包含更多的信息,准确地告诉你发生了什么。日志的其他部分怎么说?这可能会帮助您:@tyczj mp.stop()正在停止mediaplayer!A为什么不直接给onDestroy打电话?如果我暂停“活动”中的音乐并按“后退”按钮退出,则会毫无例外地调用“活动”onDestroy(),我想这也是同样的硬代码。我还需要onDestroy()中的3行exitAll(),因为我不希望用户按“后退”按钮以任何方式停止音乐,谢谢我没有想到内存不足的情况,很好的提示
protected void onDestroy() {
    if (!PlayerService.mp.isPlaying()) {
        stopService(playerService);
        cancelNotification();
        //finish();
    } 
    super.onDestroy();  
}