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

时间:2018-06-11 12:04:16

标签: java android service media-player

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

  1. 我的第一个解决方案是在主要活动暂停时执行'stopService()',但这阻止了音乐在其他活动中播放。

  2. 在onStop方法中尝试了同样的问题,发生了同样的问题。

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

    我的服务代码:

    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方法在我改变我不想要的活动时停止了音乐。

4 个答案:

答案 0 :(得分:1)

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

更多内容:Stop MediaPlayer service when app goes in Background

答案 1 :(得分:0)

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

enter image description here

请记住onStop()

  

在内存不足的情况下,可能永远不会被调用   系统没有足够的内存来保持您的活动   调用onPause()方法后运行的进程。

所以它应该以这种方式解决你的问题

@Override
public void onStop() {
    super.onStop();

     if(player.isPlaying()){
        player.stop();
        player.release();
        }
}

答案 2 :(得分:0)

使用onStop()或onPause()来停止服务而不是onDestroy();

onStop() - 当app进入后台(不可见)时

onPause() - 出现任何弹出窗口时

答案 3 :(得分:0)

Here是实际答案,试试这个。 出于某种原因,当应用程序进入后台时,服务不会停止

它在你的stopService()调用之前很久就停止了,因为它在onHandleIntent()返回后停止了一次,在创建它之后的几毫秒。

什么没有停止的是你的Timer,它在后台线程上运行并将继续运行,直到你取消它或你的进程终止。

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