Android BroadcastReceiver的onReceive有时不会调用

时间:2015-11-20 05:06:38

标签: android google-maps google-maps-api-3 geolocation android-geofence

我的应用使用BroadcastReceiver Geofencing API。当用户输入BroadcastReceiver时,将调用Geofence

昨天,代码完美无瑕。 BroadcastReceiver通过此代码检测到我进入了我在我的地方设置的地理围栏

    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);

Geofence setExpirationDuration(Geofence.NEVER_EXPIRE)radius1609米(1英里)

今天,我卸载了这些应用并再次在同一台计算机相同设备上运行完全相同的代码。我偶然发现我的BroadcastReceiver onReceive永远不会被调用。

我检查了互联网连接,这很好。我尝试clean上的rebuildmake projectandroid studio,并在运行APK之前手动卸载android studio,但{{1}仍然没有工作。

我发现了一个重要的观点

BroadcastReceiver我置于breakpoint内(正常红色)但无效(红色带复选标记)。这是我的意思link

昨天(当完全相同的代码正常工作时),断点 有效

然后我尝试使用onReceive代替IntentService(我将在此问题的后面分享两者的代码)。 BroadcastReceiver被调用,因此IntentService正在运行。

之后,我尝试再次使用PendingIntent,而BroadcastReceiver的效果与昨天完全一样。现在,有时候会调用BroadcastReceiver

奇怪的部分每当我的BroadcastReceiver无法使我的PendingIntent重新开始工作时,我需要将IntentService更改为BroadcastReceiver

一旦它再次开始工作,BroadcastReceiver仍会调用较小的(250米)BroadcastReceiver。所以我认为radius不是问题。

我尝试调试radius并发现 onReceive必须breakpoint(而不仅仅是valid)才能使enabled正常工作。换句话说,如果断点只是BroadcastReceiver(不是enabled),则永远不会调用valid

我打电话给onReceive

BroadcastReceiver

这就是我如何称呼 Intent intent = new Intent("mypackage.ACTION_RECEIVE_GEOFENCE"); PendingIntent geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); LocationServices.GeofencingApi.addGeofences( mGoogleApiClient, getGeofencingRequest(), geofencePendingIntent ).setResultCallback(this);

IntentService

这是我的 Intent intent = new Intent(this, GeofenceUpdateService.class); PendingIntent geofencePendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); LocationServices.GeofencingApi.addGeofences( mGoogleApiClient, getGeofencingRequest(), geofencePendingIntent ).setResultCallback(this); ,其中包含manifestIntentService

BroadcastReceiver

发布 <service android:enabled="true" android:name="mypackage.GeofenceUpdateService" /> <receiver android:name="mypackage.GeofenceUpdateReceiver" android:exported="false"> <intent-filter > <action android:name="mypackage.ACTION_RECEIVE_GEOFENCE"/> </intent-filter> </receiver> onReceive因为问题不在这些代码中,而是为什么这些方法有时不被调用

如何让我的onHandleIntent工作更稳定? (总是工作)

或者有任何解决方法吗?我应该只使用BroadcastReceiver吗?

非常感谢你的时间

1 个答案:

答案 0 :(得分:1)

检查此答案,因为您似乎不熟悉Android的工作原理Do I need to acquire wake lock when invoking a BroadcastReceiver

然后使用WakefulBroadcastReceiver代替BroadcastReceiver并检查是否有帮助。