代码之家  ›  专栏  ›  技术社区  ›  lucidbrot

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

  •  0
  • lucidbrot  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  2
  •   greeble31    6 年前

    你的应用程序是由操作系统决定的。就因为它 可以 关闭应用程序并不意味着 .或者,在终止应用程序之前,它可能会选择延迟,等待资源变得更加有限。不同的设备和OEM实现将在不同的时间做出这些决定,这取决于设备的动态状态。

    而且,只是因为你最后一次 Activity 已被破坏并不意味着您的应用程序将被终止。主线程仍然存在。它可能在运行 CountDownTimer 或者等待广播意图等。毕竟,如果你的应用程序有什么事情要做,为什么操作系统要干扰(如果不需要的话)?

    关闭屏幕不会强制设备睡眠(尽管打开屏幕 防止 因为睡觉)。在屏幕关闭的情况下,设备将继续保持唤醒状态,以使用有效的 WakeLock 打开、设备维护周期、广播、接收到的数据包等。如果设备没有休眠,则应用程序将继续执行(即使不是应用程序使其保持唤醒状态)。

    此外,Android通常可以随时终止任何应用程序。它可以终止前台服务,即使它们持有 瓦克洛克 . 当然,你会希望先终止不那么重要的应用程序,但是随着资源越来越有限,操作系统必须变得越来越具有攻击性。

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