【Android 应用】开机未解锁时,收发广播方法

本文探讨了在不同Android版本中通过hotkey发送广播遇到的问题及解决方案,特别是在锁屏和用户锁定状态下如何正确配置应用以接收广播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

最近做了一个功能,通过hotkey发广播给到应用来通信。但是发现设置锁屏重启后,直接按hotkey,并不能启动应用。广播也没有接收到。

分析

  1. 开机未完成,广播没有发送过来
  • 发现只要不解锁就是不能通过hotkey发送广播的方式唤醒广播接收应用
  • 直接使用命令也是不能成功的
  1. 没有发送成功
  2. 发送过来了,但是没有接收到

收发导致的问题

  1. 默认情况下,如果系统版本是 Android 8.0 以上,则收不到。
  2. 如果是 Android 7.0,需要设置 directBootAware 为 true。
  3. 如果想在 Android 8.0 以上版本中收到
  • 接收方: 需要先设置 directBootAware
  • 发送方:广播发送时需要添加FLAG_RECEIVER_INCLUDE_BACKGROUND。
  1. 不管是什么版本,如果 BroadcastReceiver 所在的应用从来没有启动过(停止状态),则广播发送者需要额外添加 FLAG_INCLUDE_STOPPED_PACKAGES。

解锁前使用SharedPreference

解决方法:

  1. 设置targetSdk为小于26。但是我们的程序有很多要26以上的才能用,所以不可行

  2. 开机处于user locked状态时避免使用SharedPreference,这个也不可行。

  3. 系统应用可以设置android:defaultToDeviceProtectedStorage=”true”,我们的应用是系统应用,所以使用这个方案

  4. 补充
    在启用了 文件级加密FBE 的设备上,每位用户均有两个可供应用使用的存储位置:

  • 凭据加密 (CE) 存储空间:这是默认存储位置,只有在用户解锁设备后才可用。

  • 设备加密 (DE) 存储空间:在直接启动模式期间以及用户解锁设备后均可用。

  • 对于系统的应用,声明 android:defaultToDeviceProtectedStorage=”true” 可以把应用的默认存储空间设置为 /data/user_de/。因此,在用户没有输入凭据解密 CE 空间之前,系统只是加载 DE 下的应用。

参考

  1. SharedPreferences in credential encrypted storage are not available until after user is unlocked
  2. Boot complete 之前无法接收广播吗

侵删。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值