应用关闭时服务重新启动-START_STICKY

8
我有一个运行为web服务器的应用程序。该应用程序具有START_STICKY服务,我希望该服务一直运行Web服务器(在通知中向用户提供停止选项)。
问题在于当我滑动关闭应用程序时,服务器将被重新启动(丢失设置等)。它可以正常运行,但logcat显示它正在重新启动。
我可以重新打开我的应用程序并绑定到新服务,这很好。尽管再次滑动关闭会产生相同的影响。
我需要使其不重新启动。
标准服务代码
private WebServerService mService;
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder binder) {
        WebServerService.MyBinder b = (WebServerService.MyBinder) binder;
        mService = b.getService();
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
    }
};

public serviceStart() {
    mIntent = new Intent(mContext.getApplicationContext(), WebServerService.class);
    mContext.startService(mIntent);
    mContext.bindService(mIntent, mConnection, Context.BIND_AUTO_CREATE);
}

服务启动

 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, START_STICKY, startId);
    Log.d("SERVICE","Started");
    return START_STICKY;
}

看一下@fedepaol 给出的答案:当应用程序被杀死时,Android 后台服务正在重新启动 - Maclaren
这不是我要的,它讨论的是根本不想让它重新启动!我想让它甚至都不接近。谢谢,但我认为是在解除绑定之后发生的事情。 - RuAware
您的服务可能会被系统终止,这是您无法控制的。但是,如果您使用了“start sticky”选项,您的服务将会在空意图下重新启动。在重新启动后,您需要恢复您的状态。 - JohanShogun
请问您能提供启动服务的代码吗?常量START_STICKY表示服务在关闭后应重新启动。如果您不希望它在关闭后重新启动,则START_NOT_STICKY将是适当的选择。 - Want2bExpert
4个回答

9
简短回答:无法避免。当系统需要内存或用户从最近应用列表中滑出应用程序时,系统或用户都可以终止每个Android应用程序。这是Android的设计规范,所有应用程序都必须遵守。唯一(小)的改进是将服务设置为前台服务

在此情况下,系统认为该服务是用户正在积极使用的内容,因此不会在内存不足时将其终止。(理论上,当前前台应用程序压力极大时仍可能终止服务,但实际上不应该成为问题。)


1
感谢您的帮助。startForeground()确实可以防止用户通过滑动关闭应用程序来重新启动服务,这正是我想要的。我知道如果内存不足,它会重新启动,但我已经处理了这个问题。但到目前为止,在我的所有测试中都没有发生过这种情况。 - RuAware
你救了我的一天。 - yarin

2

1

就像Mimmo所说的那样:你不能。如果内存不足,系统确实可以杀死应用程序/服务。此外,用户也可以这样做。可以在应用程序设置中使用强制关闭按钮或滑动应用程序来关闭它。滑动关闭就像强制停止一样。关闭应用程序时,应用程序/服务不会重新启动。这就是系统的工作原理。自己试试,下载Advance Task Killer并杀死Facebook。如果您在几秒钟后重新启动Advance Task Killer,您将看到Facebook再次运行。现在打开Facebook并使用滑动功能将其关闭。现在再次启动任务管理器。您将看到Facebook不再运行。同样,这就是系统的工作方式。 将服务设置为前台服务也不会有帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接