Мне нужно, чтобы какой-то код инициализации выполнялся ровно один раз, как можно скорее после каждой перезагрузки, а затем никогда больше не запускался, пока устройство работает.
- Сохранение SharedPreference, которое указывает, что запуск кода не подходит, поскольку он выживает при перезагрузке.
- Опознавание
ACTION_SHUTDOWN, чтобы очистить значение SharedPreference недостаточно, потому что бывают случаи, когда это не будет отправлено (например, батарея удалена). - Использование статического поля для указания запуска кода не подходит, поскольку оно будет reset, если мое приложение будет убито.
- Использование некоторого кода инициализации в моем классе приложения не подходит, потому что это будет работать снова, если мое приложение будет убито.
- Прием
ACTION_BOOT_COMPLETEDпочти достаточно хорош, но этому могут предшествовать другие широковещательные передачи, на которые реагирует мое приложение (например,ACTION_TIME_CHANGED), и его можно запустить после того, как я уже запустил приложение из панели запуска. Мне нужен этот одноразовый установочный код для запуска до этого. - Я не могу полагаться на
System.currentTimeMillis, чтобы вычислить время загрузки, потому что изменения часов изменили явное время загрузки.
Один из вариантов заключается в том, чтобы получить последнее время загрузки устройства и посмотреть, изменилось ли это (System.elapsedTime() недостаточно). Я пробовал выполнять команды типа who -b и last reboot, но разрешение было отклонено для обоих.
Другим вариантом является сохранение настроек/предпочтений где-нибудь, когда он будет получать reset ТОЛЬКО, если устройство перезагружается, но не если мое приложение будет убито.
Есть ли другой вариант или способ реализовать одно из указанных выше?