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