一个应用发送到另一应用的广播超时导致ANR

时间:2019-06-17 14:50:07

标签: android

我有两个应用。一个是收藏家,另一个是 Uplaoder 。收集器收集一些数据,并通过广播发送到上载器,然后上载到服务器。 现在的问题是,有时Collector将广播发送给Uplaoder时,广播超时并抛出ANR。 我已经在我的Uploader应用程序中检查到没有正在进行的繁重工作,这会影响超时。它只是启动了服务而已。

这里是例外 enter image description here

这是Uplaoder广播接收者

public class DataReceiver extends BroadcastReceiver {
private static final String TAG = DataReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent) {
    AndroidApplication application = (AndroidApplication) context.getApplicationContext();
    if (BuildVersionsHelper.isBuildVersionMAndAbove()) {
        if (!application.isSystemUser()) {
            return;
        }
    }
    Log.d(TAG, "Event upload request through DataReceiver");
    JobIntentService.enqueueWork(context, SimpleInterfaceReceiverService.class,
            Constants.SIMPLE_INTERFACE_JOB, intent);
}}

添加广播接收器的清单

 <receiver android:name=".intentreceiver.DataReceiver">
        <intent-filter>
            <action android:name="com.symbol.dataanalytics.TRANSPORT_INTENT" />
        </intent-filter>
    </receiver>

发送广播的收藏家代码

Bundle eventBundle = new Bundle();
    Intent intent = new Intent(EVENT_ACTION);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(TIMESTAMP, String.valueOf(System.currentTimeMillis()));
    intent.putExtra(DATA, eventBundle);
    intent.putExtra(TYPE, eventName);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setData(null);
    intent.setPackage("com.xxx.Uploader");
    intent.setAction("com.xxx.xxx.TRANSPORT_INTENT");
    sendBroadcast(intent);

现在这些超时是警告,但是为什么这些超时在应用程序中显示ANR?

1 个答案:

答案 0 :(得分:0)

我已经找到了根本原因。

这里的原因是Collector应用在主线程上做过多的工作,这在日志中很明显。由于收集器应用程序,我可以看到CPU负载为11%。

现在同时 Collector 应用尝试将广播发送到 Uploader 应用。由于 Collector 在CPU上的运行情况比预期的Android操作系统要严重得多,因此 Collector发送到Uploader 的广播被延迟或无法到达目的地。现在,由于尚未在接收器应用程序上提高ANR(即 Uploader ),OS认为还没有从onRecieve推测的时间返回广播,因此广播还没有恢复10秒。

注意:即使发送方存在一些问题,我仍然不确定在接收方提高ANR的理论。如果我错了,请纠正我。