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

Android ONN应用长时间休眠唤醒后无响应,求唤醒后重启方案

解决方案:实现长时间休眠唤醒后自动重启应用

一、监听系统唤醒广播触发重启

Android设备从休眠唤醒时会发送ACTION_SCREEN_ON广播,通过注册广播接收器捕获该事件,即可触发应用重启逻辑,同时记录休眠时间来判断是否为「长时间休眠」。

  1. 定义广播接收器类
    创建继承自BroadcastReceiver的类,在事件回调中处理时间判断与重启操作:
public class WakeRestartReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
            // 读取之前记录的休眠开始时间
            SharedPreferences prefs = context.getSharedPreferences("AppPrefs", Context.MODE_PRIVATE);
            long lastSleepTime = prefs.getLong("last_sleep_time", 0);
            long currentTime = System.currentTimeMillis();
            // 设置长时间休眠阈值(示例为8小时,可按需调整)
            long threshold = 8 * 60 * 60 * 1000;
            
            // 满足长时间休眠条件则重启应用
            if (currentTime - lastSleepTime > threshold && lastSleepTime != 0) {
                Intent restartIntent = context.getPackageManager()
                        .getLaunchIntentForPackage(context.getPackageName());
                restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(restartIntent);
                android.os.Process.killProcess(android.os.Process.myPid());
            }
        } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
            // 设备休眠时记录当前时间
            SharedPreferences prefs = context.getSharedPreferences("AppPrefs", Context.MODE_PRIVATE);
            prefs.edit().putLong("last_sleep_time", System.currentTimeMillis()).apply();
        }
    }
}
  1. 注册广播接收器
    从Android 8.0开始,静态注册的广播接收器对系统广播失效,需改为动态注册,在应用主Activity的生命周期中完成注册与解绑:
private WakeRestartReceiver wakeRestartReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 注册接收器
    wakeRestartReceiver = new WakeRestartReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    registerReceiver(wakeRestartReceiver, filter);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // 解绑接收器,避免内存泄漏
    if (wakeRestartReceiver != null) {
        unregisterReceiver(wakeRestartReceiver);
    }
}

同时在AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

二、针对React Web App场景的优化方案

由于你的应用是Android加载React Web App,长时间休眠后可能出现WebView进程挂起、JS上下文丢失的情况,可以先尝试重载WebView,无效再触发应用重启:

// 在广播接收器的onReceive方法中添加
if (MainActivity.webView != null) {
    MainActivity.webView.post(() -> {
        // 先尝试重载WebView
        MainActivity.webView.reload();
        // 验证React应用是否正常初始化
        MainActivity.webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                // 通过JS交互判断React应用状态
                view.evaluateJavascript("window.ReactIsReady", value -> {
                    if ("null".equals(value) || "undefined".equals(value)) {
                        // React未正常启动,重启应用
                        restartApp(context);
                    }
                });
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                restartApp(context);
            }
        });
    });
} else {
    restartApp(context);
}

// 提取通用重启方法
private void restartApp(Context context) {
    Intent restartIntent = context.getPackageManager()
            .getLaunchIntentForPackage(context.getPackageName());
    restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(restartIntent);
    android.os.Process.killProcess(android.os.Process.myPid());
}

三、关键注意事项

  • 电池优化适配:将应用加入系统电池优化白名单,避免Doze模式限制后台广播触发。
  • 阈值调整:根据实际测试结果修改长时间休眠的时间阈值,确保只在真正的长时间休眠后触发重启。
  • 权限适配:Android 13及以上版本可能需要动态申请POST_NOTIFICATIONS权限,保证后台逻辑正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:20:15