穿OS ANR on broadcast act=android.intent.action.SCREEN_OFF

Wear OS ANR on broadcast act=android.intent.action.SCREEN_OFF

我的 WearOS 应用经常收到关于 android.intent.action.SCREEN_OFF 广播的 ANR,我还没有注册。

它主要发生在 Samsung Galaxy Watch4 设备上,例如我正在开发的设备。

案子很复杂,谷歌搜索没有太大帮助。这是流程,请耐心等待:

  1. 应用程序正常启动,按预期运行;
  2. 手表向下转动,屏幕熄灭。到目前为止一切顺利;
  3. 我等待大约 20 秒,让 Wear OS 将我的应用移至后台并 return 移至表盘;
  4. 我在 ADB 中看到该应用程序是 运行;
  5. 我打开手表,屏幕亮了,我看到了表盘,我的应用程序在后台;
  6. 我将手表重新调低,等待几秒钟,然后它因 ANR 而崩溃

Reason: Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x50200010 (has extras) }

我已经开发了一段时间,我知道如何阅读日志,但我没有发现任何可以引导我注册这个广播但没有响应的东西。我能想到的唯一可能的原因是我使用的进口商品很少。他们在这里:

dependencies {
    implementation 'com.google.android.gms:play-services-wearable:17.1.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'androidx.wear:wear:1.2.0'
    implementation 'androidx.core:core-splashscreen:1.0.0-beta01'
    implementation 'androidx.preference:preference:1.2.0'
    implementation 'com.mcxiaoke.volley:library:1.0.19'
    implementation 'androidx.viewpager2:viewpager2:1.0.0'
}

SDK:

        minSdk 25
        targetSdk 31

我确实怀疑启动画面离屏幕最近并删除了它,但还是发生了 ANR。

我什至尝试实现我自己的 BroadcastReceiver,它不会在 onPause 上注销以便给系统一些答案,甚至将 this.goAsync().finish(); 添加到它的 onReceive(),但它没有帮助。

有人碰到过这个吗?任何帮助将不胜感激!

更新 2022-04-24:

在 Galaxy 4 手表 FVC8 版本的最后一次 OTA 更新后,该问题似乎已解决。出于历史原因将此保留在这里,而 FVC8 之前的版本仍然有效。


几个小时后,在 Yuri Schimke 的评论之后,我明白了 Google 正是针对此问题的错误报告。

https://issuetracker.google.com/issues/220190983

我可以通过为 BOTH Intent.ACTION_SCREEN_OFF AND BroadcastReceiver BroadcastReceiver Intent.ACTION_SCREEN_ON 除了记录事件和调用 this.goAsync().finish(); 什么都不做。此 BroadcastReceiveronCreate 注册并在 onDestroy 取消注册。

这样就不会再发生 ANR,尽管我还不确定它对电池有什么影响。