2015-12-05 4 views
1

У меня есть класс 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); 
} 

Должен ли я называть 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

Должен ли я всегда называть stopSelf(), когда я возвращаюсь с моей службы?

Вы называете stopSelf() (или stopService() извне службы), когда вы больше не хотите, чтобы сервис должен быть запущен. Не просто бросайте код в Service без очень четкого плана, когда эта служба должна и не должна работать. Only have a service running when it is actively delivering value to the user.

В этом случае я не совсем уверен, почему вы не выбрали IntentService, учитывая, что он обрабатывает ваши потоки и «мне нужно остановиться?». вопросы для вас.

Это сказанное, учитывая существующий код, и при условии, что нет ничего другого сервиса, чем то, что вы показали здесь, вы должны позвонить stopSelf():

  • В onStartCommand(), если вы на самом деле не происходит чтобы делать какие-либо работы (как вы потом не активно поставлять ценность для пользователя), а не возвращать START_STICKY

  • в конце run(), когда вы делаете делает работу (и, следовательно, больше не будет активно поставлять ценность для пользователя)

Смежные вопросы