为什么广播接收器仅在华为设备上引起ANR?

问题描述

我有一个广播接收器(已声明清单),它可以监听意图并启动jobIntentService。由于jobIntentService使用的是工作线程,并且Broadcast Receiver没有任何繁重的操作(它仅接收意图并调用jobIntentService)。广播接收器中不应有任何ANR原因。另外,我仅在华为设备上获得ANR。

enter image description here

enter image description here

这是我的广播接收器代码:

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。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...