You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在设备关机前可靠执行代码?解决ShutDown广播接收不稳定问题

解决关机前存储SharedPreferences不稳定的问题

监听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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:28:22