【问题标题】:Prevent MediaPlayer from playing multiple audio files in Broadcastreceiver at same time防止 MediaPlayer 在 Broadcastreceiver 中同时播放多个音频文件
【发布时间】:2017-01-20 22:29:38
【问题描述】:

我已经实现了一个 MediaPlayer,它在接收到某个 Intent 时开始在 BroadcastReceiver 中播放音频文件。 我尝试使用 isPlaying() 方法在开始另一个音频之前检查 MediaPlayer 是否正在播放某些内容。如果 Intent 在 Activity 生命周期内多次触发,它就可以正常工作。

我的问题是,当 Activity 启动时,Intent 总是被触发,因此使得 BroadcastReceiver 每次都创建一个 MediaPlayer 对象,例如去另一个活动,然后回来。 我不想在离开当前活动时停止音频(并且它不会随着我当前的代码停止),我只想防止 MediaPlayer 在播放另一个音频时再次开始播放。 那么我该如何创建一个可以从 BroadcastReceiver 访问的全局 MediaPlayer?或者如何检查 MediaPlayer 是否已经存在,以便 BroadcastReceiver 不会在每次收到 Intent 时创建 MediaPlayer 对象?

【问题讨论】:

    标签: android android-activity broadcastreceiver android-mediaplayer android-lifecycle


    【解决方案1】:

    我建议创建一个广播接收器启动/停止的单独服务。在此服务中创建您的 MediaPlayer 对象。然后,您可以检查该服务是否已在运行,以查看您的 MediaPlayer 是否已存在。或者更好的方法是创建与服务的绑定,以便您可以从活动中与之交互。下面是一些代码,您可以使用它来检查您的服务当前是否正在运行。

    public boolean isServiceRunning(Context context, Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
    

    您可以使用 isServiceRunning(this, MyService.class) 调用它,它会返回 true 或 false。

    我还强烈建议您查看https://developer.android.com/guide/components/bound-services.html 以了解有关绑定到您的服务的更多信息,然后您可以与您的 MediaPlayer 进行互动,尽情享受。

    【讨论】:

    • 我最后实际上使用了 (AudioManager) context.getSystemService(Context.AUDIO_SERVICE).isMusicActive() ,因为如果我像你建议的那样创建另一个服务,我将不得不重建我的整个代码,尽管我认为这将是解决我的问题的更优雅的方式。无论如何,非常感谢!当我优化我的代码时,我一定会尝试你的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多