0

我的应用程序使用BroadcastReceiverGeofencing API。当用户输入Geofence时,将调用BroadcastReceiverAndroid BroadcastReceiver的onReceive有时不叫

昨天,代码工作完美无瑕。该BroadcastReceiver检测我进入地理栅栏,我周围设置我的地方这段代码:

builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); 

GeofencesetExpirationDuration(Geofence.NEVER_EXPIRE)radius1609仪表(1英里)

今天,我卸载该应用程序并运行完全相同的代码再次,在相同的计算机相同的设备。我偶然发现我的BroadcastReceiveronReceive从来没有被调用。

我检查了互联网连接,这很好。我试图clean,rebuildmake projectandroid studio和手动卸载APK之前运行android studioBroadcastReceiver仍然无法正常工作。

还有很重要的一点,我发现

breakpoint我把里面的onReceive启用(纯红色),但无效(红色标记)。这是我的意思是link

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

然后我试着用IntentService而不是BroadcastReceiver(我会在后面的问题中分享他们两人的代码)。 IntentService被称为,因此我的PendingIntent正在工作。

之后,我试着再次使用BroadcastReceiverBroadcastReceiver与昨天完全一样。现在,有时候BroadcastReceiver有时不会被调用。

奇怪的部份是我需要改变PendingIntentIntentService每次我BroadcastReceiver不工作,使我BroadcastReceiver重新开始工作。

而且一旦它再次开始工作,BroadcastReceiver仍然称为更小(250米)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,同时包含的IntentServiceBroadcastReceiver

 <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> 

不要发帖onReceiveonHandleIntent因为问题不在这些代码里面,但是为什么这些方法有时候不叫

如何使我的BroadcastReceiver工作更稳定? (总是在工作)

或者是否有任何解决方法?我应该用IntentService来代替吗?

非常感谢您的时间

+0

全新安装的应用程序后,你有没有手动启动应用程序?有时候,如果你不首先启动应用程序,它不会工作。 –

+0

感谢您的回复。这些应用程序会自动运行,因为我从'android studio'运行它,我的意思是'手动'是我从'android studio'运行新的''之前卸载旧的'APK'。 –

回答

1

检查这个答案,因为它似乎是你不熟悉的Android是如何工作的Do I need to acquire wake lock when invoking a BroadcastReceiver

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

+0

非常感谢您的帮助。我确定当我测试我的'BroadcastReceiver'时,设备仍然醒来(屏幕没有睡眠)。我会尝试使用'WakefulBroadcastReceiver'并让你知道 –

相关问题