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

Android按电源键时Firebase文档删除失效、回调未触发的问题求助

问题分析与解决方案

你遇到的这个情况大概率是Android 10及以上系统的后台限制策略导致的,具体来说是Pixel 2(Android 10)的Doze模式或App Standby机制限制了后台异步操作的执行。

为什么会出现这个问题?

当按下电源键锁屏时,Android 10会更快地将应用纳入Doze模式:

  • Doze模式下,系统会严格限制应用的网络访问、CPU使用,甚至直接冻结后台进程。
  • 你在onPause()中发起的Firebase delete()是异步网络操作,可能还没来得及完成或触发回调,应用进程就被系统限制/冻结了,导致回调完全无法执行。
  • 而按下Home键时,应用只是进入后台但不会立刻进入Doze模式,所以异步操作能正常完成。

可行的解决方案

1. 使用WorkManager调度删除任务

WorkManager是Jetpack官方组件,专门用于保证后台任务的执行——即使应用被后台限制、进程被终止,它也会在系统允许的时机自动执行任务,这是最可靠的解决方案。

首先,添加WorkManager依赖(如果还没引入):

implementation "androidx.work:work-runtime:2.8.1"

然后创建一个Worker类来执行删除操作:

public class DeletePlayerDocWorker extends Worker {
    private static final String TAG = "DeletePlayerDocWorker";
    private FirebaseFirestore mFirestore;
    private String mPlayerDocId;

    public DeletePlayerDocWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
        // 初始化Firebase实例
        mFirestore = FirebaseFirestore.getInstance();
        mPlayerDocId = params.getInputData().getString("PLAYER_DOC_ID");
    }

    @NonNull
    @Override
    public Result doWork() {
        if (mPlayerDocId == null) {
            Log.w(TAG, "No player document ID provided");
            return Result.failure();
        }
        try {
            // 在WorkManager的后台线程中,用同步方式执行删除(避免异步被系统中断)
            mFirestore.collection("players").document(mPlayerDocId).delete().get();
            Log.d(TAG, "Player document deleted successfully");
            return Result.success();
        } catch (Exception e) {
            Log.w(TAG, "Error deleting player document", e);
            // 可设置重试策略,比如自动重试3次
            return Result.retry();
        }
    }
}

最后在onPause()中调度这个任务:

protected void onPause() {
    super.onPause();
    if (mPlayerDocRef != null) {
        String docId = mPlayerDocRef.getId();
        // 传递文档ID给Worker
        Data inputData = new Data.Builder()
                .putString("PLAYER_DOC_ID", docId)
                .build();
        // 构建单次执行的任务请求
        OneTimeWorkRequest deleteRequest = new OneTimeWorkRequest.Builder(DeletePlayerDocWorker.class)
                .setInputData(inputData)
                // 可选:设置任务执行的约束,比如必须有网络连接
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build())
                .build();
        // 提交任务到WorkManager
        WorkManager.getInstance(this).enqueue(deleteRequest);
    }
    if (mAuthStateListener != null) {
        mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
    }
}

2. 额外验证方法

你可以在Pixel 2的开发者选项中关闭Doze模式(搜索“Doze”找到对应开关),然后测试锁屏时的删除操作。如果此时能正常执行,就可以100%确认是Doze模式导致的问题。

内容的提问来源于stack exchange,提问作者FractalBob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:52:41