Direct Boot (Android Development Patterns S3 Ep 8)
官网视频链接:
https://www.youtube.com/watch?v=fb2Zwmc3Sp4
What is Direct Boot?
从Android N 开始,设备启动后,用户未解锁之前,可以进入一个叫Direct Boot的模式,在这个模式下,操作系统全速运转,除非应用已经设置过可以进入Direct Boot,不然无法访问应用的数据,也就无法对应用进行相关操作。
Is Direct Boot right for my app?
但是并不是所有的应用都适用进入该模式,一些即时性需求较高的应用可以进行相应的设置,比如闹钟、消息类通讯应用、向其他应用或者系统提供服务的应用等。
Making your app Direct Boot aware
通过在Manifest文件中按如下明确指定的方式,可以让app在Direct Boot模式时运行,
<activity|provider|receiver|service
android:directBootAware=”true”>
当系统进入Direct Boot模式时,会发送Intent.ACTION_LOCKED_BOOT_COMPLETED的广播,App可以监听该广播以进入Direct Boot模式,用户解锁设备后,所有app仍然能够监听到Intent.ACTION_BOOT_COMPLETED的广播。
Using the device protected storage area
在用户未解锁之前要是app能够运行,需要解锁私有的app的数据,Android N设备提供两种类型的存储位置:
1.Credential protected storage。默认的所有应用数据存储位置,只有在设备解锁后才能使用。
2.Device protected storage。新的存储类型,只要设备是启动后,随时可以访问存在在这里的数据,包括Direct boot模式时。
所以要使app在Direct Boot模式下能运行,除了前面在Manifest里进行的显示声明外,需要将在Direct Boot模式下运行时涉及的数据存储到Device protected storage,注意只应该将能使app在Direct Boot模式下运行必须的数据存放在Device protected storage,其他的一些用户敏感数据应该放在Credential protected storage,要访问Device protected storage,需要在使用所有文件相关的API时,用以下的Context,
Context deviceProtectedContext = context.createDeviceProtectedStorageContext();
deviceProtectedContext.openFileInput( ... )
可以使用Context.moveSharedPreferencesFrom() 和Context.moveDatabaseFrom()
对原来的数据进行转存,
备注:可以通过以下方法直接判断设备当前的解锁状态: