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'並讓你知道 –

相關問題