android - 什么时候必须手动停止服务?

标签 android

我有一个从 Service 扩展的 SendMessageService 类。该类在后台向服务器发送聊天消息。 我总是必须调用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);
}

我是否必须在 return START_STICKY 上方调用 stopself()

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() 吗?

最佳答案

Do I always have to call stopSelf() when I return from my service?

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

在这种情况下,我不太确定您为什么不选择 IntentService,考虑到它处理您的线程和“我需要停止吗?”给你的问题。

话虽这么说,鉴于您现有的代码,并假设除了您在此处显示的内容之外没有其他服务,您应该调用 stopSelf():

  • onStartCommand() 中,如果您实际上不打算做任何工作(因为您没有主动向用户提供值(value)),而不是返回 START_STICKY

  • run() 结束时,当您正在执行工作时(因此将不再主动向用户交付值(value))

关于android - 什么时候必须手动停止服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34105247/

相关文章:

android - 方法内 PendingIntent 语句中的 "AlarmReceiverChangeImage"错误消息

android - 如何在 Android 的 CalenderView 中获取选定的日期?

android - 单击时小部件不启动服务

android - 在代码中包含 C++ 预处理器指令 - Android NDK

android - 在 Android 中将 OnValueChange 实现为 NumberPicker

android - 混洗现有 View

java - 当我将 Retrofit2.0 与 POST 一起使用时, body 为 null ,但响应代码为 5xx?

android - 在 Android 中将任何 View 放在 VideoView 上

android - “com.example.volleyexample.app.AppController”不可分配给 'android.app.Activity'

java - 无法上传大小超过 2mb+ 的图像