我在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
任何人都可以帮助我吗?感谢
答案 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();
}