添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1. 直接启动模式定义

直接启动模式是在Android7.0之后出现的,生命周期为:当设备已正常开机但用户尚未解锁设备。默认情况下,应用不会在“直接启动”模式下运行。如果您的应用需要在“直接启动”模式下执行操作,您可以注册应在此模式下运行的应用组件。

需要在“直接启动”模式下运行的一些常见应用用例包括:

已安排通知的应用,如闹钟应用;

提供重要用户通知的应用,如短信应用。

提供无障碍服务的应用,如 Talkback。

2. 数据存储区域

为了支持此模式,系统为数据提供了两个存储位置:

凭据加密存储: 这是默认存储位置,仅在用户解锁设备后可用。

设备加密存储: 该存储位置在“直接启动”模式下和用户解锁设备后均可使用。

如果应用在“直接启动”模式下运行时需要访问数据,请使用设备加密存储。设备加密存储包含使用密钥加密的数据,该密钥只有在设备成功执行启动时验证后才可用。

3. 直接启动实例

如果某个组件想在直接启动模式下运行,则需将你的组件标记为加密感知,则需要在AndroidManifest.xml 将 android:directBootAware 属性设为 true。

当设备重启后,加密感知组件可以注册以接收来自系统的ACTION_LOCKED_BOOT_COMPLETED
广播消息。此时,设备加密存储可用,您的组件可以执行需要在“直接启动”模式下运行的任务,例如触发已设定的闹铃。

以下代码段示例说明了如何在应用清单中将BroadcastReceiver
注册为加密感知并将 ACTION_LOCKED_BOOT_COMPLETED
添加为intent 过滤条件:

    <receiver
      android:directBootAware="true" >
      <intent-filter>
        <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
      </intent-filter>
    </receiver>

在用户解锁设备后,所有组件均可访问设备加密存储和凭据加密存储。

4. 如何访问设备加密存储

如需访问设备加密存储,请通过调用 Context.createDeviceProtectedStorageContext() 创建另一个 Context 实例, 通过此上下文发出的所有存储 API 调用均访问设备加密存储。以下示例会访问设备加密存储并打开现有的应用数据文件:

    Context directBootContext = appContext.createDeviceProtectedStorageContext();
    // Access appDataFilename that lives in device encrypted storage
    FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
    // Use inStream to read content...

5. 接收用户解锁通知

当用户在重启后解锁设备时,应用可以切换至访问凭据加密存储,并使用依赖用户凭据的常规系统服务。

为了在重启后用户解锁设备时收到通知,请从正在运行的组件注册BroadcastReceiver以监听解锁通知消息。在用户重启后解锁设备时:

 如果应用具有需要立即获得通知的前台进程,请监听ACTION_USER_UNLOCKED 消息。

如果应用仅使用可以对延迟通知执行操作的后台进程,请监听ACTION_BOOT_COMPLETED​ 消息。

您可以通过调用UserManager.isUserUnlocked()直接查询用户是否已解锁设备。

6. 检查设备政策加密状态

设备管理应用可以使用DevicePolicyManager.getStorageEncryptionStatus()检查设备目前的加密状态

 如果应用面向的 API 级别为 24.0 或更高级别,且设备使用全盘加密,getStorageEncryptionStatus() 将返回 ENCRYPTION_STATUS_ACTIVE。

 如果设备使用带“直接启动”的文件级加密,它将返回 ENCRYPTION_STATUS_ACTIVE_PER_USER。