我有一个从 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/