当应用程序处于前台状态时,Android可以停止服务吗?

时间:2018-12-04 15:09:43

标签: android android-service

在我的应用程序中,第一个活动的onCreate中启动了一项服务,我想确保只要该应用程序处于前台状态,该服务就可以运行。

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

4 个答案:

答案 0 :(得分:0)

根据有时可能出现的文档:

  

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

source

答案 1 :(得分:0)

此处的最佳做法是使用ForegroundService。这是一个常规服务,它调用startForeground()方法以确保该服务正在运行。例如,它已被音乐播放器广泛使用...因此,您可以发现,没有人喜欢系统在播放歌曲的过程中终止音乐服务。这应该做。  Service Overview

中的更多内容

答案 2 :(得分:0)

在这种情况下,我认为系统不会单方面销毁您的Service。也就是说,我从未见过它能做到这一点(但是我没有任何引用来支持它)。

如果您曾说过“ ...并且该服务已绑定到活动”,那么我会走得更远:“该服务在绑定时不会被销毁”,因为这意味着会突然调用onServiceDisconnected(),而不是unbindService()的提示。

答案 3 :(得分:0)

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

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