Как передать дополнительные значения в службу с помощью START_STICKY? - PullRequest
0 голосов
/ 19 декабря 2018

В моем приложении для Android у меня есть служба, которая должна быть перезапущена автоматически после того, как она будет убита.Я обнаружил, что это можно сделать с помощью START_STICKY.

Но, очевидно, когда служба автоматически перезапускается, цель - null.Проблема, однако, заключается в том, что намерение используется для передачи значения.См. Пример ниже:

public class MyService extends Service {
    public static final String MY_STRING_HANDLE = "MyString";

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        // Read my string from intent
        Bundle extras = intent.getExtras(); // ERROR: Intent can be null
        if (extras == null) {
            throw new Error("Intent did not contain my string");
        }

        String myString = extras.getString(MY_STRING_HANDLE);
        if (myString == null || myString.isEmpty()) {
            throw new Error("Intent did not contain my string");
        }

        // Do something with my string
        doSomeThing(myString);

        return START_STICKY;
    }
}

Поэтому обычно я запускаю службу следующим образом:

Intent intent = new Intent(activity, MyService.class);
intent.putExtra(MyService.MY_STRING_HANDLE, "Example string");
activity.startService(intent);

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

java.lang.NullPointerException: Попытка вызвать виртуальный метод 'android.os.Bundle android.content.Intent.getExtras ()' для ссылки на пустой объект

Итак, мой вопрос: если я не могу использовать намерения, то как мне передать значения (например, myString) своему сервису?


Что касается возможного дубликата:Мой вопрос не о том, почему намерение null, а о том, как я могу справиться с этим.

1 Ответ

0 голосов
/ 19 декабря 2018

Используйте START_REDELIVER_INTENT вместо START_STICKY.Кроме того, убедитесь, что для каждой Intent, которую вы полностью обрабатываете, вызовите stopSelf() со значением ID, указанным в соответствующем вызове, к onStartCommand().

Затем, если Android завершит ваш процесс (например, низкий уровень)памяти), Android перезапустит ваш сервис и доставит вам любые Intent объекты, которые вы не указали (через stopSelf()), которые вы обработали.


В качестве альтернативы, не полагайтесь на Intentдополнительные услуги.Вместо этого сохраните ваши данные в файле, базе данных, SharedPreferences, сервере и т. Д., И ваш сервис получит данные оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...