Java 应用程序进入后台时如何停止服务

Java 应用程序进入后台时如何停止服务,java,android,service,media-player,Java,Android,Service,Media Player,我有一个多活动应用程序。在主活动中,启动播放音乐的服务。当我浏览活动时,音乐仍在播放(这是我想要的),但当我单击“主页”按钮,应用程序进入后台时,音乐仍在播放(这是我不想要的) 我的第一个解决方案是在主活动暂停时执行“stopService()”,但这会阻止音乐在其他活动中播放 在onStop方法中尝试了相同的方法,出现了相同的问题 Q:当整个应用程序在后台运行时,如何停止播放音乐(停止服务) 我的服务代码: public class MediaService extends Service {

我有一个多活动应用程序。在主活动中,启动播放音乐的服务。当我浏览活动时,音乐仍在播放(这是我想要的),但当我单击“主页”按钮,应用程序进入后台时,音乐仍在播放(这是我不想要的)

  • 我的第一个解决方案是在主活动暂停时执行“stopService()”,但这会阻止音乐在其他活动中播放

  • 在onStop方法中尝试了相同的方法,出现了相同的问题

  • Q:当整个应用程序在后台运行时,如何停止播放音乐(停止服务)

    我的服务代码:

    public class MediaService extends Service {
    private MediaPlayer player;
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        player = MediaPlayer.create(this, R.raw.music);
        player.setLooping(true);
        player.start();
        return START_STICKY;
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    
        player.stop();
    }
    
    我通过以下方式启动/停止服务:

     music_intent = new Intent(this, MediaService.class);
     startService(music_intent);
     stopService(music_intent);
    

    p.S.谢谢所有的答案,但正如我所说,当我改变活动时,onStop方法会停止音乐,这是我不想要的。

    根据活动生命周期,你应该使用onStop()停止播放音频

    记住onStop()

    在内存不足的情况下,可能永远不会调用 系统内存不足,无法保存活动的 调用onPause()方法后运行的进程

    所以用这种方法应该可以解决你的问题

    @Override
    public void onStop() {
        super.onStop();
    
         if(player.isPlaying()){
            player.stop();
            player.release();
            }
    }
    
    使用onStop()或onPause()停止服务,而不是onDestroy()

    onStop()-当应用程序进入后台时(不可见)

    onPause()-当出现任何弹出窗口时,请尝试此操作。 由于某些原因,当应用程序转到后台时,服务不会停止

    它在stopService()调用之前很久就停止了,因为它在创建之后的毫秒内,在handleintent()返回时停止了

    不停止的是计时器,它在后台线程上运行,并将继续运行,直到您取消它或进程终止


    恕我直言,这是对IntentService的不当使用。如果要控制寿命,请使用onDestroy()中的服务并停止后台工作。

    在使用应用程序的类似问题中找到此解决方案。ActivityLifecycleCallbacks在应用程序类中检查应用程序何时进入后台,然后向服务发送广播以停止它


    更多信息:

    首先,您为什么要提供服务?服务背后的要点是在UI不在前台时执行工作。如果您只希望在应用程序处于前台时完成工作,请不要使用服务。使用普通Java对象。要想知道你的应用程序何时从前景中走来,请考虑<代码> ProcessLifecycleOwner 。OnStand方法在我改变活动时停止音乐,这是我不想做的事情。停止方法,当我改变那些我不想要的活动时,停止音乐。