我何时必须手动停止服务?

时间:2015-12-05 13:07:56

标签: android

我有一个SendMessageService类,它从Service扩展而来。该类在后台向服务器发送聊天消息。 当我从服务中退回时,总是是否必须致电stopSelf()

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent == null || !AppUtil.hasInternetConnection(this)) {
        return START_STICKY;
    }

    startID = startId;

    handler = new Handler();
    messageDatabase = MessageDatabase.getInstance(this);

    sendMessages();

    return super.onStartCommand(intent, flags, startId);
}

我是否必须在stopself()上方致电return START_STICKY

private void sendMessages() {
    // get all unsend messages
    new Thread() {
        @Override
        public void run() {
            synchronized (lock) {
                final ArrayList<Message> messages = new ArrayList<Message>();
                messageDatabase.getConditionBuilder().add(DatabaseHelper.KEY_MESSAGE_SENT + " = ?",
                        new String[] { String.valueOf(0) });
                messageDatabase.getConditionBuilder().setSortOrder(DatabaseHelper.KEY_MESSAGE_LOCAL_TIME + " ASC");
                messages.addAll(messageDatabase.getList());

                // ...
                sendMessageRecursive(0, messages);
            }
        }
    }.start();
}

private void sendMessageRecursive(final int index, final ArrayList<Message> messages) {
    if (index >= messages.size()) {
        stopSelf(startID);
        return;
    }

    // ...
}

在这种情况下我是否需要致电stopSelf()

1 个答案:

答案 0 :(得分:1)

  

当我从服务中退回时,是否总是要调用stopSelf()?

当您不再希望服务运行时,您可以从服务外部呼叫stopSelf()(或stopService())。不要只是将代码扔进Service而没有一个非常明确的计划,以确定该服务应该和不应该运行的时间。 Only have a service running when it is actively delivering value to the user

在这种情况下,我不太确定为什么你没有选择IntentService,因为它处理你的线程并且“我需要停止吗?”问题。

话虽如此,鉴于您现有的代码,假设服务没有其他内容,您应该致电stopSelf()

  • onStartCommand()中,如果您实际上没有做任何工作(因为您没有积极地为用户提供价值),而不是返回START_STICKY

  • run()结束时,当您正在做这项工作时(因此将不再积极地为用户提供价值)