代码之家  ›  专栏  ›  技术社区  ›  sdabet

当应用程序在前台时,Android可以停止服务吗?

  •  1
  • sdabet  · 技术社区  · 6 年前

    在我的应用程序中,有一个服务是在第一个活动的onCreate中启动的,我想确保只要该应用程序仍在前台,该服务就一直在运行。

    当应用程序在前台时,系统是否可能停止服务?

    4 回复  |  直到 6 年前
        1
  •  0
  •   Nikos Hidalgo farhad mohammadi    6 年前

    根据文件,有时可能:

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

    ( source )

        2
  •  0
  •   Janeviemus    6 年前

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

        3
  •  0
  •   greeble31    6 年前

    Service 在这种情况下。也就是说,我从来没有见过它能做到这一点(但我没有任何参考资料支持这一点)。

    如果您说,“…服务与活动绑定”,我会更进一步:“绑定时服务不会被破坏”,因为这意味着突然调用 onServiceDisconnected() unbindService() .

        4
  •  0
  •   Hossam Hassan    6 年前

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

    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 并将开始意图和停止意图放在我们刚刚在应用程序类中创建的方法中