使用唤醒锁
在设计中播放媒体中的应用程序时 在后台运行时,设备可能会在您的服务运行时进入睡眠状态。 因为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
答案 0 :(得分:2)
您的应用是否存在取决于操作系统。仅仅因为它可以关闭应用程序并不意味着它会。或者,它可以选择延迟,等待资源变得更有限,然后再终止您的应用程序。不同的设备和OEM实现将在不同的时间做出这些决定,这取决于设备的动态状态。
此外,仅因为您的最后一个Activity
被销毁并不意味着您的应用将被终止。主线程仍然在那里。它可能正在运行CountDownTimer
,或者正在等待广播意图,等等。毕竟,如果您的应用有事要做,为什么操作系统应该干预(如果不必这样做)?
关闭屏幕不会强制设备进入睡眠状态(尽管打开防止进入睡眠状态)。在关闭屏幕的情况下,设备将继续对处于有效状态WakeLock
打开的应用,设备维护期,广播,收到的数据包等保持清醒状态。如果设备未处于睡眠状态,则您的应用将继续执行(即使不是让您的应用保持清醒状态)。
此外,Android通常可以随时随地终止任何应用程序。即使它们拥有WakeLock
,它也可以终止前景服务。自然,您希望不太重要的应用程序首先被终止,但是随着资源的越来越有限,操作系统必须变得越来越激进。
这就是为什么您应该描述您的应用对操作系统的相对重要性(使用Services
,Foreground服务,Wakelocks
等)。