如何解决为什么广播接收器仅在华为设备上引起ANR?
我有一个广播接收器(已声明清单),它可以监听意图并启动jobIntentService。由于jobIntentService使用的是工作线程,并且Broadcast Receiver没有任何繁重的操作(它仅接收意图并调用jobIntentService)。广播接收器中不应有任何ANR原因。另外,我仅在华为设备上获得ANR。
这是我的广播接收器代码:
public class SessionReceiver extends BroadcastReceiver {
private static final String TAG = "SessionReceiver";
@Override
public void onReceive(Context context,Intent intent) {
if (intent.getAction() == null) return;
Log.d(TAG,"onReceive: called");
SessionChangeService.enqueueWork(context,intent);
}
}
如您所见,我只是将工作放入广播接收器中,但是在华为设备上仍会收到ANR。
清单声明
<receiver
android:name=".receivers.SessionReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION" />
<action android:name="android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION" />
</intent-filter>
</receiver>
JobIntentService:
public class SessionChangeService extends JobIntentService {
private static final String TAG = "SessionChangeService";
public static void enqueueWork(Context context,Intent intent) {
Log.d(TAG,"enqueueWork: enqueued");
enqueueWork(context,SessionChangeService.class,Constants.SESSION_CHANGE_JOB_ID,intent);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
//...work...
}
}
ANR日志为:
Broadcast of Intent { act=android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION flg=0x2030 pkg=/.receivers.SessionReceiver (has extras) }
任何帮助将不胜感激。
解决方法
您可能需要将您的应用添加到“受保护的”应用列表中,或者将其添加到允许在后台运行的应用列表中。在许多低端设备以及小米,华为等设备上。除非将应用程序明确添加到此列表中,否则它们不会自动启动(或重新启动)应用程序。在“电池”,“电源管理”或“安全性”下查看“设置”。
有关更多信息,请参见以下内容:
BroadcastReceiver works for a while,then stops
"Protected Apps" setting on Huawei phones,and how to handle it
还可以尝试
转到设置->应用->右上角的菜单->特殊访问->电池优化。选择您的应用,然后单击“不允许”。
,基于上述分析,此问题与SessionReceiver无关,而应是应用程序导航/ UI中的某个问题,该问题阻止了主线程。 在主线程被阻塞的情况下,广播接收器也将在主线程中被阻塞,并最终导致ANR。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。