Как я могу передать Намерение Сервису при его запуске (но только иногда)

1

Итак, я работаю над Android-приложением для школьного проекта и поразил странную ошибку до конца разработки. Часть приложения - это Служба, которая работает в фоновом режиме и периодически проверяет сервер, но должна быть опция, следует ли запускать службу в фоновом режиме или скорее использовать ручные проверки. Чтобы избежать дублирования кода, то, что я пытался сделать, это передать Intent вместе с сервисом, когда он начинается с логического значения в строке "Принудительное обновление один раз, а затем остановитесь". Тем не менее, моя служба, похоже, не получает эту ценность.

Код, запускающий службу:

Intent intent = new Intent(this, EmpCheckinService.class);
intent.putExtra("singleCheckInOnly", true);
intent.putExtra("locationString", location);

startService(intent);

И код в классе службы:

// This is the old onStart method that will be called on the pre-2.0
// platform.  On 2.0 or later we override onStartCommand() so this
// method will not be called.
@Override
public void onStart(Intent intent, int startId) {
    examineIntent(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    examineIntent(intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}

private void examineIntent(Intent intent) {
    try {
        singleCheckInOnly = intent.getExtras().getBoolean("singleCheckInOnly", false);
        locationString = intent.getExtras().getString("locationString");
    } catch (Exception e) {
        // Don't need to do anything here, just prevent from crashing if the keys aren't found
    }
}

Как вы можете видеть, у меня есть onStart и onStartCommand, чтобы он мог работать на устройствах с версией 1.5 или 2.1+, но он никогда не попадает ни в одну из этих функций. Может ли кто-нибудь указать мне в правильном направлении?

EDIT: Я думаю, что нашел проблему. Вызывается onCreate перед onStartCommand?

  • 1
    Вы говорите, что, кажется, не получает это значение, означает ли это, что система аварийно завершает работу при извлечении ( singleCheckInOnly = intent.getExtras().getBoolean("singleCheckInOnly", false) )?
  • 0
    Нет, у меня есть точки останова в начале каждой из этих функций, и отладчик никогда не нажимает на них, а идет прямо в остальную часть службы
Теги:
service
android-intent

2 ответа

1

Вызывается onCreate перед onStartCommand?

Да.

Это будет значительно проще и удобнее, если вы:

Шаг # 1: Создайте IntentService, а не Service и

Шаг # 2: используйте AlarmManager для отправки Intents в службу для периодических проверок с сервером

Затем, с точки зрения обслуживания, нет никакой разницы между проверкой на основе таймера и проверкой, инициированной пользователем.

  • 0
    Можно ли запустить IntentService и оставить его в фоновом режиме? Я посмотрел на них обоих, но, по-моему, из-за этой проблемы мне пришлось воспользоваться Service.
  • 0
    @zachtib: «Можно ли запустить IntentService и оставить его в фоновом режиме?» - нет, и это по замыслу. Ваша цель - чтобы ваш сервис работал как можно меньше. Хранение службы в памяти только для того, чтобы отмечать время, расточительно, и поэтому пользователи атакуют вас убийцами задач и тому подобным. Если вы осуществляете опрос по времени, правильный ответ - использовать AlarmManager и IntentService .
0

если у вас есть более 1 дополнительного места, то предпочтительно использовать пакет

Tos отправлять дополнительные функции -

 Intent i = new Intent(sender.this,receiver.class);
           Bundle extras = new Bundle();
    extras.putString("key1",element);
    extras.putString("key1",element);
    extras.putString("key2",element2);
    extras.putString("key3",element3);
    extras.putString("key4",element4);
  ......so on
        i.putExtras(extras);

для использования -

   Bundle extras2 = getIntent().getExtras();

            if (extras != null){
            final String str = extras2.getString("key1");
final String str = extras2.getString("key2");
final String str = extras2.getString("key3");
final String str = extras2.getString("key4");
final String str = extras2.getString("key5");
......so  on

Ещё вопросы

Сообщество Overcoder
Наверх
Меню