Android N (7.0)以降から、ダイレクトブートという仕組みが取り入れられました。
普通に電源をつけた起動と、ユーザーが起動後ロックを外す時点が変わります。
開発者視点、何が困るかっていうと、今までインテントフィルタで
<action android:name="android.intent.action.BOOT_COMPLETED" />
を検知していればよかったのですが、Android N (7.0)以降からはただ単に起動した場合は、BOOT_COMPLETEDを検知できません。(>_<)
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
というのを検知する必要があります。
ユーザーがロックを解除してから動作して十分なアプリならいいんですが、例えば目覚まし時計や、メッセージング的なアプリだとユーザーがロックを外す前に動作する必要がありますよね。
なので、LOCKED_BOOT_COMPLETEDを検知する必要があります。
AndroidManifest.xmlは次のようにします。
<receiver android:name=".receivers.BootReceiver" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
下記もわすれずにつけましょう!
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
そして、この起動検知でわかりにくい部分は下記のストレージのことだと思います。(´・ω・)
それを書きたいがために、これを書いたようなものです。
それは、
のページにありますが、この仕組みのために、「認証情報暗号化ストレージ」と「端末暗号化ストレージ」という仕組みができました。
名称、わかりにくっ!!
今までの、普通に使っていたプリファレンスファイルなどが「認証情報暗号化ストレージ」です。
「端末暗号化ストレージ」が新しくできた仕組みですが、これはダイレクトブートのために、できたんですかね??
「認証情報暗号化ストレージ」はユーザーがロックを外してからアクセスできるストレージです。
「端末暗号化ストレージ」はユーザーがロックを外さないでもアプリがアクセスできるストレージです。
なので、ダイレクトブートで使う情報を格納しておくには、「端末暗号化ストレージ」に保存しないといけません。
「認証情報暗号化ストレージ」のほうが、ユーザーがロックを外してからアクセスできる場所なので、秘匿性の高い情報はこちらに格納しましょう。
情報の保存の仕方や、従来のプリファレンスファイルからの移動は長くなるので、下記のGoogleさんが配布しているサンプルコードを見たほうがいいでしょう。
端末暗号化ストレージに保存したpreferenceファイルを見る