ANR意图广播 {act=com.google.android.c2dm.intent.RECEIVE flg=0x10 cmp=receiver.GcmBroadcastReceiver(有额外信息)}

3
我收到了一个针对BroadcastReceiver的ANR日志,但是为什么呢?onReceive()只是启动了一个IntentService,这应该只需要花费几毫秒,对吗?而且IntenteServiceonHandleIntent()是在后台调用的。
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
    }
}

// GcmIntentService

@Override
    protected void onHandleIntent(Intent intent) {
        // executing db related stuff

        // Release the wake lock provided by the WakefulBroadcastReceiver.
        WakefulBroadcastReceiver.completeWakefulIntent(intent);
    }

日志的第一部分:

----- pid 4006 at 2015-07-02 15:51:35 -----

JNI:CheckJNI关闭,解决方法关闭,pins=0,globals=496

DALVIK THREADS:(mutexes:tll=0 tsl=0 tscl=0 ghl=0)

"main" prio=5 tid=1 WAIT | group="main" sCount=1 dsCount=0 obj=0x4185eea0 self=0x41750030 | sysTid=4006 nice=-11 sched=0/0 cgrp=apps handle=1073869140 | state=S schedstat=( 0 0 0 ) utm=10745 stm=2490 core=0 at java.lang.Object.wait(Native Method) - waiting on <0x4185ef70> (a java.lang.VMThread) held by tid=1 (main) at java.lang.Thread.parkFor(Thread.java:1205) at sun.misc.Unsafe.park(Unsafe.java:325) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:813) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:846) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1175) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:180) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256) at com.google.android.gms.analytics.bn.e((null):-1) at com.google.android.gms.analytics.c.f((null):-1) at com.google.android.gms.analytics.b.uncaughtException((null):-1) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690) at dalvik.system.NativeStart.main(Native Method)

我已经通过manifest.xml注册了我的接收器:

<receiver
    android:name="receiver.GcmBroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />

        <category android:name="de.cwalz.receiver" />
    </intent-filter>
</receiver>

您可以发布实际的日志条目。 - CommonsWare
1
我猜我找到了问题所在:我应该调用GCMBroadcastReceiver.completeWakefulIntent(intent);而不是WakefulBroadcastReceiver.completeWakefulIntent(intent);,这将释放锁定。 - Chris
你可能做不到。首先,这可能甚至不是你的进程。我仍然不明白你如何在问题中将LogCat行与你的应用程序联系起来。 - CommonsWare
我在我的回答中已经告诉过你了(uncaughtException)。 - ceph3us
Google Analytics for Android似乎存在一个bug:https://productforums.google.com/forum/#!topic/analytics/w_NLv91h0Pk。我将删除`tracker.enableAdvertisingIdCollection(true);`这一行代码,然后再试一次。 - Chris
显示剩余3条评论
1个回答

1

当您使用以下内容时:

Context#registerReceiver(BroadcastReceiver,IntentFilter)

  • 任何应用程序都可以向已注册的接收器发送广播

  • 您可以通过权限控制谁可以向其发送广播

  • 当您在应用程序清单中发布接收器并为其指定意图过滤器时,任何其他应用程序都可以向其发送广播,而不管您指定的过滤器是什么。

  • 要防止他人向其发送广播,请使用android:exported =“false”将其设为不可用。

在您的情况下,问题在于:

com.google.android.gms.analytics中的未捕获异常

(ANR可能由死锁引起-主线程正在等待Thread:1205)

解决方案:

  • 为onReceive()过滤不想要的广播,

  • 尝试捕获异常

  • 如果无法尝试Ovverride一些方法


你检查过是谁在向你的广播接收器发送广播了吗? - ceph3us
不是,但这与我的初始问题有关吗?实际上,我使用permission:元素。 - Chris
你把家里的钥匙都给了每个人吗? - ceph3us
1
好的,我已经在我的接收器中添加了android:exported="false"以防止外部应用程序访问这些接收器。我想我找到了问题,请查看问题中的评论。 - Chris

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