简介
最近做了一个功能,通过hotkey发广播给到应用来通信。但是发现设置锁屏重启后,直接按hotkey,并不能启动应用。广播也没有接收到。
分析
- 开机未完成,广播没有发送过来
- 发现只要不解锁就是不能通过hotkey发送广播的方式唤醒广播接收应用
- 直接使用命令也是不能成功的
- 没有发送成功
- 发送过来了,但是没有接收到
收发导致的问题
- 默认情况下,如果系统版本是 Android 8.0 以上,则收不到。
- 如果是 Android 7.0,需要设置 directBootAware 为 true。
- 如果想在 Android 8.0 以上版本中收到
- 接收方: 需要先设置 directBootAware
- 发送方:广播发送时需要添加FLAG_RECEIVER_INCLUDE_BACKGROUND。
- 不管是什么版本,如果 BroadcastReceiver 所在的应用从来没有启动过(停止状态),则广播发送者需要额外添加 FLAG_INCLUDE_STOPPED_PACKAGES。
解锁前使用SharedPreference
解决方法:
-
设置targetSdk为小于26。但是我们的程序有很多要26以上的才能用,所以不可行
-
开机处于user locked状态时避免使用SharedPreference,这个也不可行。
-
系统应用可以设置android:defaultToDeviceProtectedStorage=”true”,我们的应用是系统应用,所以使用这个方案
-
补充
在启用了 文件级加密FBE 的设备上,每位用户均有两个可供应用使用的存储位置:
-
凭据加密 (CE) 存储空间:这是默认存储位置,只有在用户解锁设备后才可用。
-
设备加密 (DE) 存储空间:在直接启动模式期间以及用户解锁设备后均可用。
-
对于系统的应用,声明 android:defaultToDeviceProtectedStorage=”true” 可以把应用的默认存储空间设置为 /data/user_de/。因此,在用户没有输入凭据解密 CE 空间之前,系统只是加载 DE 下的应用。
参考
- SharedPreferences in credential encrypted storage are not available until after user is unlocked
- Boot complete 之前无法接收广播吗
侵删。