Ответ 1
Я понял решение. Причина связана с комбинацией двух вещей:
-
Переустановка создает новый другой uid одного и того же приложения (обратите внимание, что при переустановке я имел в виду удалить приложение с телефона, а затем использовать Eclipse для переустановки).
-
По умолчанию в теге службы значение "экспортировано" равно false, как описано здесь
Независимо от того, могут ли компоненты других приложений вызывать службу или взаимодействовать с ней - "истина", если они могут, и "ложь", если нет. Когда значение "ложно", только компоненты одного приложения или приложений с одним и тем же идентификатором пользователя могут запустить службу или привязать ее к ней. Значение по умолчанию зависит от того, содержит ли служба фильтры намерений. Отсутствие каких-либо фильтров означает, что его можно вызвать только путем указания его точного имени класса. Это означает, что служба предназначена только для внутреннего использования приложения (так как другие не знают имя класса). Поэтому в этом случае значением по умолчанию является "false". С другой стороны, наличие по меньшей мере одного фильтра подразумевает, что служба предназначена для внешнего использования, поэтому значение по умолчанию "true" .
Итак, я решил проблему, просто установив флаг в значение "true" . (пример кода распознавания активности Google использует значение "false" вместо "true" .)
<service
android:name="edu.umich.si.inteco.captureprobe.contextmanager.ActivityRecognitionService"
android:enabled="true"
android:exported="true"
>
</service>
Интересно, что тот же код работает на Android 4.3 или ниже. Я протестировал свой код на четырех разных телефонах с другой версией Android, и проблема удаления/переустановки произошла только на телефоне Android 4.4. Поэтому, почему я был озадачен этой проблемой. Почему этого не случилось раньше? В любом случае, если вы столкнетесь с одной и той же проблемой (то есть одно и то же приложение не сможет использовать службу после ее переустановки), отметьте флажок "экспортированный".