关于在onStart之前调用的android:onStop

onStop called before onStart

我有一个从AlarmManager调用的活动。 这是一条警报信息。

从Key Guard调用Activity时,生命周期从onCreate - > onStart - > onResume - > onPause - > onStop开始,然后返回onCreate - > onStart - > onResume。

由于它是一个警报活动,我已将MediaPlayer.stop行放在Activity的onStop中,但现在警报声在启动后停止。

如果我将MediaPlayer.stop放在onDestroy中,我会得到正确的行为,但是如果用户按下主页按钮,活动就会消失并且声音会继续播放。

任何人都可以告诉为什么在这种情况下调用onPause和onStop?

编辑:在日志中进行一些调查后,我找到了这一行:

1
11-26 17:39:01.273: I/ActivityManager(385): Activity reported stop, but no longer stopping: ActivityRecord{41827a90 u0 net.xisberto.workschedule/.AlarmMessageActivity}


好吧,经过一年多的时间,我意识到这个问题从来没有得到答案,虽然我必须解决这个问题,所以在这里:

现在我在onResume期间启动MediaPlayer,但如果它已经在播放,我不再启动它:

1
2
3
4
5
6
7
8
9
@Override
protected void onResume() {
    super.onResume();
    ...
    if (!mMediaPlayer.isPlaying()) {
        mMediaPlayer.start();
    }
    ...
}

我在onStop期间停止它,但仅当活动isFinishing时:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected void onStop() {
    super.onStop();
    if (isFinishing()) {
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    } else {
        ...
    }
}

因为在描述的情况下,Activity没有完成,但重新启动(配置更改,我认为),MediaPlayer不会停止。

我的代码并不完全相同,因为我使用了一些其他函数,并使用Notification将用户带回Activity。 完整的代码在这里:https://github.com/xisberto/workschedule/blob/master/src/net/xisberto/work_schedule/AlarmMessageActivity.java


在没有处理此事件的情况下,您正好旋转了设备。

您可以通过对清单进行少量修改来处理此问题:

1
2
3
<activity android:name=".MyActivity"
      android:configChanges="orientation"
      android:label="@string/app_name">