Wear OS在广播act=android.intent.action.SCREEN_OFF上出现ANR。

3

我的WearOS应用程序经常出现关于android.intent.action.SCREEN_OFF广播的常规ANR,而我并没有注册它。

这主要发生在三星Galaxy Watch4设备上,就像我正在开发的那个一样。

情况很复杂,谷歌搜索也没有帮助太多。以下是流程,请耐心阅读:

  1. 应用程序正常启动,按预期工作;
  2. 手表向下转动,屏幕关闭。到目前为止还好;
  3. 我等待约20秒,让Wear OS将我的应用程序移到后台并返回手表表盘;
  4. 我在ADB中看到该应用程序正在运行;
  5. 我将手表翻转过来,屏幕亮起来,我看到了手表表盘,我的应用程序在后台;
  6. 我再次将手表翻转向下,等待几秒钟,然后它崩溃了并显示ANR。

原因:Intent { act = android.intent.action.SCREEN_OFF flg = 0x50200010(具有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时不注销它以便给系统一些回答,甚至在其onReceive()中添加了this.goAsync().finish();,但这并没有帮助。

有人遇到过这种情况吗?任何帮助都将不胜感激!


1
可能与https://issuetracker.google.com/issues/220190983有关。 - Yuri Schimke
谢谢,我相信这正是所需之处! - KaHa6uc
1个回答

3

更新于2022-04-24:

在Galaxy 4手表的上个OTA更新中,即版本FVC8后,这个问题似乎已经解决。在此对此前FVC8版本仍然有效的情况进行历史记录。


几个小时后,在Yuri Schimke的评论之后,我明白了此事情确实存在一个向Google报告的错误。

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

我通过为BroadcastReceiver实现同时 Intent.ACTION_SCREEN_OFFAND Intent.ACTION_SCREEN_ON 来规避此问题,仅记录事件并调用 this.goAsync().finish();。该 Broadcast Receiver 在 onCreate 上注册并在 onDestroy 上取消注册。

这样就不会再发生 ANR 了,但我还不确定它对电池有何影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接