onReceive()
只是启动了一个IntentService
,这应该只需要花费几毫秒,对吗?而且IntenteService
的onHandleIntent()
是在后台调用的。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>
GCMBroadcastReceiver.completeWakefulIntent(intent);
而不是WakefulBroadcastReceiver.completeWakefulIntent(intent);
,这将释放锁定。 - Chris