Android 如何在应用程序暂停或销毁时停止服务,而不是在它切换到新活动时停止服务?

Android 如何在应用程序暂停或销毁时停止服务,而不是在它切换到新活动时停止服务?,android,service,android-mediaplayer,onpause,android-intentservice,Android,Service,Android Mediaplayer,Onpause,Android Intentservice,目前我有一个服务,我正在使用它在应用程序打开时在后台播放声音文件: public class BackgroundSoundService extends Service { MediaPlayer player; public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { super.onCreate()

目前我有一个
服务
,我正在使用它在应用程序打开时在后台播放声音文件:

public class BackgroundSoundService extends Service {

    MediaPlayer player;

    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.sound);
        player.setLooping(true);
        player.setVolume(100, 100);
    }

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

    @Override
    public void onDestroy() {
        player.stop();
        player.release();
    }
}
服务
在my
main活动中启动,如下所示:

BackgroundSoundService backgroundSoundService = new Intent(this, BackgroundSoundService.class);
我希望
服务
在应用程序打开时继续运行,但在应用程序最小化或销毁时停止运行。我认为解决这一问题的最初方法是覆盖
onPause
onDestroy
,并实现这一行:

stopService(backgroundSoundService);

但是,当我随后切换到另一个
活动
,则会触发
暂停
,并停止
服务。我如何确保只要应用程序在前台打开,
服务
就会继续运行,但当应用程序最小化或关闭时就会停止?

您可以尝试使用
onBackPressed
来发现您的安卓应用程序何时将被最小化

您可能有一个活动是主
main活动
,在上按下该活动将导致应用程序最小化。然后停止
服务

顺便说一句,您应该使用单例,以便为您的
backgroundSoundService

让所有可以最小化应用程序的活动扩展此
BaseActivity

public abstract class BaseActivity extends Activity {

    @Override
    public void onBackPressed() {
        //check if should be minimized...
        //if so stop the Service
    }

}
需要一个主页按钮的解决方案吗

这很棘手,因为没有按键事件来区分“Home pressed”

您可以使用
onPause
中的方法

当活动进入
后台时
主页键时,活动将完成

因此,只需使用布尔值检查您是否调用了(使用
Intent
)其他活动

将您的
onPause
方法更新为:

@Override
public void onPause() {
    if(!isFinishing()){
        if(!calledOtherActivity){
            stopService(serviceRef);
        }
    }
}

这是个好主意。但是,这并不包括我按下
Home
按钮,我还必须在每个活动中覆盖
onBackPressed
,以获得所需的结果。你应该只覆盖
onBackPressed
可以最小化应用程序的活动。如果您有几个这样的活动,那么我已经更新了此场景的答案。。