【问题标题】:Android service restarts after app closed应用关闭后Android服务重启
【发布时间】:2014-11-01 10:40:43
【问题描述】:

我有一个设计为始终在后台运行的 android 服务,类似于 WhatsApp 的 MessageService 所做的。当应用程序启动时,它会确保服务确实在运行。稍后,其中一个活动绑定到服务以使用它的一些方法,除了服务已经做的事情之外,当活动销毁时 - 它与服务解除绑定。 到目前为止一切顺利,这似乎有效。

但是当我关闭我的应用程序(通常不是强制停止)时,服务似乎会在一分钟左右自行重启,然后继续正常工作。 但是当我查看 WhatsApp 的服务时,我发现这并没有发生 - 在您关闭应用程序后,服务继续正常运行并且不会自行重启。

关于导致此问题的原因以及如何解决它的任何提示?

编辑 代码,按要求:

服务的相关部分:

    public static boolean isRunning = false;
    ... 
    ...
    @Override
public int onStartCommand(final Intent intent, int flags, int startId) {
    if (!isRunning) {
        isRunning = true;

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                connect(intent.getIntExtra(Constants.ID, -1),
                        intent.getStringExtra(Constants.PASSWORD));
            }
        });
        thread.start();
    }
    return START_REDELIVER_INTENT;
......
}

在应用启动时启动服务

        if (!ChatService.isRunning) {
        Intent chatService = new Intent(this, ChatService.class);
        chatService.putExtra(Constants.ID, LocalManager.getID());
        chatService.putExtra(Constants.PASSWORD, LocalManager.getPassword());
        startService(chatService);
    }

在其中一个活动中绑定到服务

    void bindService() {
    bindService(new Intent(Chats.this, ChatService.class), mConnection,
            Context.BIND_AUTO_CREATE);
    mIsBound = true;

}

第二次编辑 事实证明它与绑定到服务无关,即使我没有绑定到服务也会发生相同的行为(应用程序关闭时服务会重新启动)。在单独的进程上运行服务也没有解决这个问题。

【问题讨论】:

  • 向我们展示您的代码、服务、活动,以及您开始服务的位置。
  • 添加了@Romadja 代码块。
  • 那么,您现在的问题是什么?如果您返回 START_REDELIVER_INTENT 则意味着您已准备好销毁服务,并且可以重新建立它,因此不会造成任何问题。
  • 你在哪里打电话给stopService()
  • @Flow 我根本不叫这个。

标签: android service xmpp


【解决方案1】:

如果在其他地方使用startService()方法启动服务,即使绑定到它的activity被销毁,它也会自动重启,所以请确保只通过bindService()方法启动服务。

【讨论】:

  • 但我需要服务在活动解除绑定后运行,据我了解,如果我仅使用 bindService 启动服务,它会在我的活动解除绑定时停止。我说的对吗?
  • 其实不是。如果您取消与服务的绑定,这意味着您的活动没有与您的服务通信,但服务应该是活动的。
  • 那我应该放弃startService,只使用bindService吗?如果我希望服务在绑定之前启动怎么办? (例如,确保它在应用启动时运行,并且只在特定的活动中绑定到它)
  • @Romadja this answer 声明通过绑定启动的服务将在活动解除绑定时终止
  • 是的,如果您不调用 startService(),只需调用 bindService(),在这种情况下,当您从活动中取消绑定服务时,该服务将终止。但正如我所见,您使用 startService() 这意味着当您从活动中取消绑定服务时,它不会死
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多