我的应用使用BroadcastReceiver
Geofencing API
。当用户输入BroadcastReceiver
时,将调用Geofence
。
昨天,代码完美无瑕。 BroadcastReceiver
通过此代码检测到我进入了我在我的地方设置的地理围栏:
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
Geofence
setExpirationDuration(Geofence.NEVER_EXPIRE)
和radius
为1609
米(1英里)
今天,我卸载了这些应用并再次在同一台计算机和相同设备上运行完全相同的代码。我偶然发现我的BroadcastReceiver
onReceive
永远不会被调用。
我检查了互联网连接,这很好。我尝试clean
上的rebuild
,make project
和android 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);
,其中包含manifest
和IntentService
:
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
吗?
非常感谢你的时间
答案 0 :(得分:1)
检查此答案,因为您似乎不熟悉Android的工作原理Do I need to acquire wake lock when invoking a BroadcastReceiver。
然后使用WakefulBroadcastReceiver
代替BroadcastReceiver
并检查是否有帮助。