【问题标题】:Can Android stop a service while app is in foreground?Android可以在应用程序处于前台时停止服务吗?
【发布时间】:2018-12-06 02:16:10
【问题描述】:

在我的应用中,在第一个活动的 onCreate 中启动了一项服务,我想确保只要应用保持在前台,该服务就会运行。

是否有可能在应用处于前台时系统停止服务?

【问题讨论】:

  • 一个服务和 ui 在同一个线程上运行,所以我看不出这样做的理由。
  • 问题:操作系统是否曾经终止过您的服务?我怀疑它会,只要应用程序在前台。
  • 我正在寻找类似的东西,我明天会链接你我的代码

标签: android android-service


【解决方案1】:

在这种情况下,我认为系统不会单方面破坏您的Service。也就是说,我从未见过它这样做(但我没有任何参考资料来支持它)。

如果你说,“......服务绑定到 Activity”,我会更进一步:“服务在绑定时不会被销毁”,因为这意味着突然调用onServiceDisconnected(),不是由unbindService() 提示的。

【讨论】:

    【解决方案2】:

    根据有时可能的文档:

    服务进程是一个持有已使用 startService() 方法启动的服务的进程。虽然这些进程对用户来说是不直接可见的,但它们一般都在做用户关心的事情(比如后台网络数据上传或下载),所以系统会一直保持这些进程运行,除非内存不足保留所有前台和可见进程。 已经运行了很长时间(例如 30 分钟或更长时间)的服务的重要性可能会被降级,以允许它们的进程下降到下面描述的缓存 LRU 列表中。这有助于避免出现运行时间过长的情况运行存在内存泄漏或其他问题的服务会消耗大量 RAM,以致于妨碍系统有效利用缓存进程。

    (source)

    【讨论】:

    • 但在我的情况下,这个进程不是“服务进程”而是“前台进程”,因为应用程序处于前台,对吧? (我假设应用和服务在同一个进程中运行)
    • 您是如何开始服务的?它可能只是语义,但 Service 保存在服务进程中,可以是前台或后台。
    【解决方案3】:

    这里的最佳做法是使用 ForegroundService。它是一个常规服务,它调用 startForeground() 方法来确保服务正在运行。它被音乐播放器广泛使用......所以你可以想象,当系统在歌曲播放过程中终止音乐服务时,没有人喜欢。这应该做。 更多内容Service Overview

    【讨论】:

      【解决方案4】:

      首先您需要知道何时启动和停止服务。

      创建 AppLifeCycleHandler Class

      public class AppLifeCycleHandler implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 {
      
          private AppLifeCycleCallback appLifeCycleCallback;
      
          private boolean appInForeground;
      
          public AppLifeCycleHandler(AppLifeCycleCallback appLifeCycleCallback) {
              this.appLifeCycleCallback = appLifeCycleCallback;
          }
      
          @Override
          public void onActivityResumed(Activity activity) {
              if (!appInForeground) {
                  appInForeground = true;
                  appLifeCycleCallback.onAppForeground();
              }
          }
      
          @Override
          public void onTrimMemory(int i) {
              if (i == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
                  appInForeground = false;
                  appLifeCycleCallback.onAppBackground();
              }
          }
      
          @Override
          public void onActivityCreated(Activity activity, Bundle bundle) {
      
          }
      
          @Override
          public void onActivityStarted(Activity activity) {
      
          }
      
          @Override
          public void onActivityPaused(Activity activity) {
      
          }
      
          @Override
          public void onActivityStopped(Activity activity) {
      
          }
      
          @Override
          public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
      
          }
      
          @Override
          public void onActivityDestroyed(Activity activity) {
      
          }
      
          @Override
          public void onConfigurationChanged(Configuration configuration) {
      
          }
      
          @Override
          public void onLowMemory() {
      
          }
      
          interface AppLifeCycleCallback {
      
              void onAppBackground();
      
              void onAppForeground();
          }
      }
      

      现在在你的public class MyApplication extends Application

      添加以下代码implements AppLifeCycleHandler.AppLifeCycleCallback

      @Override
          public void onCreate() {
              super.onCreate();
      
              AppLifeCycleHandler appLifeCycleHandler = new AppLifeCycleHandler(this);
              registerActivityLifecycleCallbacks(appLifeCycleHandler);
              registerComponentCallbacks(appLifeCycleHandler);
      }
      

      最后:

          @Override
          public void onAppBackground() {
              Log.d("LifecycleEvent", "onAppBackground");
          }
      
          @Override
          public void onAppForeground() {
              Log.d("LifecycleEvent", "onAppForeground");
          }
      

      现在您需要做的最后一件事是创建服务,点击此链接 create-start-stop-android-background-service 并将您的启动意图和停止意图放入我们刚刚在您的应用程序类中创建的方法中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 2019-01-25
        • 2023-04-03
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多