【问题标题】:The same background music playing in all activities在所有活动中播放相同的背景音乐
【发布时间】:2017-08-20 10:47:53
【问题描述】:

我使用服务在所有活动中播放背景音乐,它可以正常工作。问题是即使我的应用程序在后台(当用户使用主页按钮或后退按钮退出时),音乐也会继续播放。我该如何解决这个问题?

服务类BackgroundSoundService

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.slow_shock);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);

    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return START_NOT_STICKY;
    }

    public void onStart(Intent intent, int startId) {
        // TO DO
    }
    public IBinder onUnBind(Intent arg0) {
        // TO DO Auto-generated method
        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {
        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }
}

开始

Intent svc = new Intent(this, BackgroundSoundService.class);
    startService(svc);

Android 清单:

<service android:enabled="true" android:name=".BackgroundSoundService" />

【问题讨论】:

  • 另一个建议是使用 1 Activity 和多个 Fragment。在这种情况下,您不需要服务,并且合理的逻辑可以取决于 Activity 的生命周期。

标签: android android-service


【解决方案1】:

这是因为服务仍然受限于活动。要在多个活动绑定到服务时终止服务,您需要将服务与所有活动解除绑定,如 documentation 所说:

服务生命周期——从创建到完成 被破坏——可以遵循以下两条路径中的任何一条:

已启动的服务

服务是在另一个组件调用 startService() 时创建的。 然后服务无限期地运行并且必须通过调用来停止自己 停止自我()。另一个组件也可以通过调用来停止服务 停止服务()。当服务停止时,系统将其销毁。

绑定服务

服务是在另一个组件(客户端)调用时创建的 绑定服务()。然后客户端通过以下方式与服务通信 一个IBinder接口。客户端可以通过调用关闭连接 解除绑定服务()。多个客户端可以绑定到同一个服务,并且 当它们全部解除绑定时,系统会销毁该服务。服务 不需要自己停止。

这两条路径并不完全分开。您可以绑定到服务 已经用 startService() 启动了。例如,您可以 通过调用 startService() 启动背景音乐服务 标识要播放的音乐的意图。后来,可能当 用户想要对播放器进行一些控制或获取信息 关于当前歌曲,活动可以通过调用绑定到服务 绑定服务()。在这种情况下,stopService() 或 stopSelf() 在所有客户端解除绑定之前实际上不会停止服务。

然后拨打Context.stopService()停止它:

context.stopService(new Intent(context, BackgroundSoundService.class));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多