Android正在停止多个活动的背景音乐服务

Android正在停止多个活动的背景音乐服务,android,android-activity,android-service,Android,Android Activity,Android Service,我有一个应用程序,它有一个播放音乐的服务。这是有效的,因为服务一直在进行(因此也在玩) 但是,当用户在任何活动中按home键时,我应该能够检测到我的应用程序是否空闲。我一直在四处寻找,发现的每个问题都有一个asnwer,比如:“使用onPause()或onStop()”,但这只适用于一个活动,将代码复制到每个活动似乎是一个肮脏的解决方案 我主要尝试过: onDestroy:按home键时不工作 onPause:即使在开始另一个意图(非意图)时也停止音乐 我曾考虑过从main检测当前活动,但这是一

我有一个应用程序,它有一个播放音乐的服务。这是有效的,因为服务一直在进行(因此也在玩)

但是,当用户在任何活动中按home键时,我应该能够检测到我的应用程序是否空闲。我一直在四处寻找,发现的每个问题都有一个asnwer,比如:“使用onPause()或onStop()”,但这只适用于一个活动,将代码复制到每个活动似乎是一个肮脏的解决方案

我主要尝试过:

  • onDestroy:按home键时不工作
  • onPause:即使在开始另一个意图(非意图)时也停止音乐
  • 我曾考虑过从main检测当前活动,但这是一个太脏的解决方案

    在我的主要活动中,我启动我的服务(BackgroundMusicLayer):


    我该怎么办?

    您需要知道的是您的活动何时在后台(以及何时返回)。有几种方法可以做到这一点,但我发现一种可靠的方法是基于答案的

    它工作的前提是,在活动转换之间使用时间引用很可能会提供足够的证据证明某个应用程序是否“有背景”

    这对我来说很有效,在回调中,你可以可靠地告诉你的服务做你想做的任何事情

    此外,如果你的应用程序转到后台,你正在玩,那么你应该在服务中启动前台(这样它会获得优先权),当应用程序返回时,只需停止前台


    这样,即使用户与应用程序交互,也可以避免始终使用前台服务。

    在暂停时你会做什么?您可能应该调用MediaPlayer的公共功能,如开始、暂停、完成后释放。Tommy K这就是问题所在,您可能建议在我的onPause方法中调用stopService(intent),但即使在我的应用程序中打开另一个活动,也会停止服务。那不是我的意图。stopService(Intent)方法只应在应用程序停止或最小化时调用(例如,按下home键,但对于较新和较旧的API,这不能被任何事件捕获)。我认为您应该接受这样一个事实:home键没有侦听器,即没有home检测。看看其他应用程序,比如潘多拉。必须按暂停按钮才能暂停音乐。否则,如果你仍然坚持检测HOME,你可以让你的服务定期检查你的应用程序是否在前台,作为一种解决办法。嗨,我已经接受了一个事实,即不可能监听HOME键。我从来没有想到android应用程序必须一直与解决方案结合在一起……很高兴你得到了它。如果您使用的是API 14,请检查我是否为后台问题添加了新的解决方案+
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
            setContentView(R.layout.activity_main);
        else
            setContentView(R.layout.activity_main_landscape);
        //_________BRON(MediaPlayer): http://stackoverflow.com/questions/3369068/android-play-sound-on-button-click-null-pointer-exception
        backgroundMusicPlayer = new Intent(MainActivity.this, BackgroundMusicPlayer.class);
        startService(backgroundMusicPlayer);
    
        mp = MediaPlayer.create(MainActivity.this, R.raw.buttonclick); //knopgeluiden laden
        super.onCreate(savedInstanceState);
    }