【问题标题】:How to Stop service when app goes in background当应用程序进入后台时如何停止服务
【发布时间】:2018-06-29 21:08:21
【问题描述】:

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

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

  2. 在 onStop 方法中尝试了相同的方法,出现了同样的问题。

:当整个应用进入后台时,如何停止播放音乐(停止服务)?

我的服务代码:

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);

附注感谢所有答案,但正如我所说,onStop 方法会在我更改我不想要的活动时停止音乐。

【问题讨论】:

  • 为什么首先要有服务?服务背后的要点是在您的 UI 处于前台时执行工作。如果您只想在应用程序处于前台时完成工作,请不要使用服务。使用普通的 Java 对象。要了解您的应用何时进入和退出前台,请考虑 ProcessLifecycleOwner

标签: java android service media-player


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    记住 onStop()

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

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

    @Override
    public void onStop() {
        super.onStop();
    
         if(player.isPlaying()){
            player.stop();
            player.release();
            }
    }
    

    【讨论】:

    • onStop 方法会在我更改我不想要的活动时停止音乐。
    【解决方案3】:

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

    onStop() - 当应用程序进入背景时(不可见)

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

    【讨论】:

    • onStop 方法会在我更改我不想要的活动时停止音乐。
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多