如何在设备关机前可靠执行代码?解决ShutDown广播接收不稳定问题
监听ACTION_SHUTDOWN广播出现不稳定,通常是因为厂商ROM拦截、关机流程过快导致异步操作未完成,或是接收器注册被系统回收。以下是几个可靠的替代/优化方案:
1. 补充监听快速关机广播
多数国产厂商的快速关机流程会发送ACTION_QUICKBOOT_POWEROFF广播,和ACTION_SHUTDOWN一起注册,能覆盖更多场景:
<receiver android:name=".ShutdownReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_SHUTDOWN" /> <action android:name="android.intent.action.QUICKBOOT_POWEROFF" /> </intent-filter> </receiver>
部分厂商可能需要额外权限,测试时可针对性适配。
2. 改用同步提交SharedPreferences
默认的apply()是异步写入磁盘,关机时可能还未完成。换成commit()同步提交,确保数据写入:
SharedPreferences.Editor editor = getSharedPreferences("my_sp", MODE_PRIVATE).edit(); editor.putString("data_key", "data_value"); editor.commit(); // 替代异步的apply()
3. 利用内存回调提前保存
重写Application或Activity的onTrimMemory方法,当系统发出内存临界信号时(常出现在关机前),提前保存数据:
@Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level == TRIM_MEMORY_COMPLETE || level == TRIM_MEMORY_RUNNING_CRITICAL) { saveDataToSharedPreferences(); } }
4. 主动检查关机状态
在应用关键生命周期节点(如onPause、onStop),通过PowerManager主动判断系统是否正在关机,触发保存:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); if (powerManager.isShuttingDown()) { saveDataToSharedPreferences(); }
5. 监听应用后台生命周期
使用ProcessLifecycleOwner监听应用进入后台事件,提前保存数据,避免关机时来不及处理:
ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() { @Override public void onStop(@NonNull LifecycleOwner owner) { super.onStop(owner); saveDataToSharedPreferences(); } });
需依赖androidx.lifecycle:lifecycle-process库。
内容的提问来源于stack exchange,提问作者Ricardo Rodrigues
相关产品推荐
相关产品推荐

