我有一个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()
?
答案 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()
结束时,当您正在做这项工作时(因此将不再积极地为用户提供价值)