Android 11设备切换应用时Activity被销毁、切回后数据丢失问题求助
根因定位
这个问题本质是Android 11及以上系统的进程回收策略导致的,你的应用切后台后被系统主动杀死,切回时触发冷启动,所以出现数据全丢、回到启动Activity的现象,真机厂商定制ROM的后台限制比原生模拟器严格很多,所以只会在真机复现,调试器断开也是因为应用进程被销毁导致的。
你之前的方案失效原因
OnSaveInstanceState仅用于存储单个Activity的临时状态,无法保留全局内存数据、单例、静态变量中的内容,进程被杀死后这些数据会全部丢失- 普通后台Service在Android 11以上优先级极低,系统清理后台进程时会优先杀死携带后台Service的应用,无法实现保活效果
- 系统通用省电开关关闭不生效,是因为小米、华为、OPPO等厂商的定制ROM有独立的后台进程管理规则,不在通用省电设置中
修复步骤
1. 确认进程被杀场景
在自定义Application类的onCreate方法中添加全局时间戳标记,验证切后台后进程是否被重启:
// 自定义Application类中添加 public static long APP_START_TIMESTAMP; @Override public void onCreate() { super.onCreate(); APP_START_TIMESTAMP = System.currentTimeMillis(); // 冷启动时从持久化存储恢复全量业务数据 restoreGlobalData(); }
每次进入主页面时输出该时间戳,如果切后台再切回时间戳发生变化,即可确认是进程被系统回收重启。
2. 全量数据持久化
所有业务数据不要只存在内存的静态变量、单例类中,每次数据更新时同步写入SharedPreferences或Room数据库,应用冷启动时主动从持久化存储恢复所有全局数据,避免进程重启后数据丢失。
3. 调整后台保活逻辑
- 把后台Service替换为前台Service,Android 11及以上需要先申请
FOREGROUND_SERVICE权限,启动服务时调用startForeground()展示常驻通知,提升进程优先级 - 引导用户将应用添加到厂商的后台运行白名单,开启允许自启动、允许后台活动、关闭电池优化例外的独立开关,避开厂商定制的后台清理规则
4. 页面状态恢复
在根Activity的onCreate方法中判断当前是否为进程重启场景,如果是则根据持久化存储的页面访问记录,直接恢复用户上次离开的页面,不要默认跳转到启动Activity。
调试方法
调试器断开是进程被杀的正常表现,你可以通过adb命令抓取系统日志确认进程被杀的具体原因:adb logcat | grep "am_kill"
也可以打开模拟器开发者选项中的【不要保留活动】开关,即可在模拟器复现应用切后台就销毁的场景,方便调试。
内容的提问来源于stack exchange,提问作者Alim
相关产品推荐
相关产品推荐

