穿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 设备上,例如我正在开发的设备。
案子很复杂,谷歌搜索没有太大帮助。这是流程,请耐心等待:
- 应用程序正常启动,按预期运行;
- 手表向下转动,屏幕熄灭。到目前为止一切顺利;
- 我等待大约 20 秒,让 Wear OS 将我的应用移至后台并 return 移至表盘;
- 我在 ADB 中看到该应用程序是 运行;
- 我打开手表,屏幕亮了,我看到了表盘,我的应用程序在后台;
- 我将手表重新调低,等待几秒钟,然后它因 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();
什么都不做。此 BroadcastReceiver
在 onCreate
注册并在 onDestroy
取消注册。
这样就不会再发生 ANR,尽管我还不确定它对电池有什么影响。
我的 WearOS 应用经常收到关于 android.intent.action.SCREEN_OFF 广播的 ANR,我还没有注册。
它主要发生在 Samsung Galaxy Watch4 设备上,例如我正在开发的设备。
案子很复杂,谷歌搜索没有太大帮助。这是流程,请耐心等待:
- 应用程序正常启动,按预期运行;
- 手表向下转动,屏幕熄灭。到目前为止一切顺利;
- 我等待大约 20 秒,让 Wear OS 将我的应用移至后台并 return 移至表盘;
- 我在 ADB 中看到该应用程序是 运行;
- 我打开手表,屏幕亮了,我看到了表盘,我的应用程序在后台;
- 我将手表重新调低,等待几秒钟,然后它因 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();
什么都不做。此 BroadcastReceiver
在 onCreate
注册并在 onDestroy
取消注册。
这样就不会再发生 ANR,尽管我还不确定它对电池有什么影响。