为什么MediaPlayer在屏幕关闭的情况下继续播放音频

时间:2019-01-07 13:35:50

标签: android

The documentation解释

  

使用唤醒锁

     

在设计中播放媒体中的应用程序时   在后台运行时,设备可能会在您的服务运行时进入睡眠状态。   因为Android系统尝试在设备时节省电量   处于睡眠状态,系统尝试关闭手机的任何功能   不需要,包括CPU和WiFi硬件。   但是,如果您的服务正在播放或流式播放音乐,则需要   防止系统干扰您的播放。

那么,为什么我在关闭屏幕后仍可以继续播放音频?

Other answers增强了我的信念

  

如果您想在活动未进行时继续播放音乐   前台,您需要使用服务。

但是我的手机没有停止播放音频。
请注意,我问这个问题是为了了解发生了什么,不是因为我想知道在屏幕变暗时如何pause the music

我未使用服务,尚未向清单中添加"android.permission.WAKE_LOCK"权限,并且正在UI线程中工作。 (尽管这首先不会引起ANR,但是UI似乎保持响应状态。)

Uri songUri = Uri.fromFile(new File(firstSong.getPath())); 
try {
    Timber.d("The following error messages regarding QCMediaPlayer can hopefully be safely ignored. See https://stackoverflow.com/questions/24501086/why-mediaplayer-throws-not-present-error-when-creating-instance-of-it");
    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setLegacyStreamType(STREAM_MUSIC).build());
    mediaPlayer.setDataSource(getApplicationContext(), songUri);
    mediaPlayer.prepare(); // TODO: use prepareAsync instead
    mediaPlayer.start();
} catch (IllegalArgumentException | IOException e){
    Timber.w("File %s does not exist.", songUri);
}

实例化mediaPlayer实际上会导致LogCat错误,但I doubt it is relevant。无论如何,这里是

E/ExtMediaPlayer-JNI: QCMediaPlayer could not be located....
E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
E/ExtMediaPlayer-JNI: QCMediaPlayer could not be located....
E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0

1 个答案:

答案 0 :(得分:2)

您的应用是否存在取决于操作系统。仅仅因为它可以关闭应用程序并不意味着它。或者,它可以选择延迟,等待资源变得更有限,然后再终止您的应用程序。不同的设备和OEM实现将在不同的时间做出这些决定,这取决于设备的动态状态。

此外,仅因为您的最后一个Activity被销毁并不意味着您的应用将被终止。主线程仍然在那里。它可能正在运行CountDownTimer,或者正在等待广播意图,等等。毕竟,如果您的应用有事要做,为什么操作系统应该干预(如果不必这样做)?

关闭屏幕不会强制设备进入睡眠状态(尽管打开防止进入睡眠状态)。在关闭屏幕的情况下,设备将继续对处于有效状态WakeLock打开的应用,设备维护期,广播,收到的数据包等保持清醒状态。如果设备未处于睡眠状态,则您的应用将继续执行(即使不是让您的应用保持清醒状态)。

此外,Android通常可以随时随地终止任何应用程序。即使它们拥有WakeLock,它也可以终止前景服务。自然,您希望不太重要的应用程序首先被终止,但是随着资源的越来越有限,操作系统必须变得越来越激进。

这就是为什么您应该描述您的应用对操作系统的相对重要性(使用Services,Foreground服务,Wakelocks等)。