Android ONN应用长时间休眠唤醒后无响应,求唤醒后重启方案
解决方案:实现长时间休眠唤醒后自动重启应用
一、监听系统唤醒广播触发重启
Android设备从休眠唤醒时会发送ACTION_SCREEN_ON广播,通过注册广播接收器捕获该事件,即可触发应用重启逻辑,同时记录休眠时间来判断是否为「长时间休眠」。
- 定义广播接收器类
创建继承自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(); } } }
- 注册广播接收器
从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
相关产品推荐
相关产品推荐

