2015-05-04 63 views
0

我在我的Android應用程序中實現了一個BroadcastReceiver(稱爲ProximityIntentReceiver),但我有一些煩人的問題。在我MainActivityonCreate()方法我調用這個函數:Android - 如何銷燬BroadcastReceiver?

addProximityAlert():

private ProximityIntentReceiver proximityIntentReceiver; 
private void addProximityAlert() { 
    pendingIntentList = new HashMap<Integer, PendingIntent>(); 
    double latitude = 37.567072; 
    double longitude = 14.273046; 
    Intent intent = new Intent(PROX_ALERT_INTENT); 
    PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 
    locationManager.addProximityAlert(
      latitude, // the latitude of the central point of the alert region 
      longitude, // the longitude of the central point of the alert region 
      POINT_RADIUS, // the radius of the central point of the alert region, in meters 
      PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no       expiration 
      proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected 
    ); 
    pendingIntentList.put(1, proximityIntent); 
    proximityIntentReceiver = new ProximityIntentReceiver(); 
    registerReceiver(proximityIntentReceiver, filter); 
    Toast.makeText(getApplicationContext(),"Alert Added",Toast.LENGTH_SHORT).show(); 
} 

這一點,相反,我的MainActivity的的onDestroy:

的onDestroy():

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    accessTokenTracker.stopTracking(); 
    if(proximityIntentReceiver!=null) { 
     unregisterReceiver(proximityIntentReceiver); 
     removeProximityAlert(); 

    } 
} 

removeProximityAlert():

private HashMap<Integer, PendingIntent> pendingIntentList; 
private void removeProximityAlert() { 

    Iterator<Map.Entry<Integer, PendingIntent>> iterator = pendingIntentList.entrySet().iterator() ; 
    while(iterator.hasNext()){ 
     Map.Entry<Integer, PendingIntent> pendingIntentMap = iterator.next(); 
     locationManager.removeProximityAlert(pendingIntentMap.getValue()); 
    } 
} 

現在,如果我改變我的BroadcastReceiver或在我addProximityAlert(),變化保持不變,直到我重新啓動設備的東西。爲什麼?我認爲通過調用unregisterReceiver()方法足以刪除BroadcastReceiver的實例...

我應該在我的代碼中添加什麼?

+0

> _現在如果我改變了我的BroadcastReceiver或我的addProximityAlert中的某些內容,那麼更改將保持不變,直到我重新啓動設備._具體而言,您在更改什麼以及您期望看到什麼? – user3452758

+0

例如,如果我更改POINT_RADIUS變量或其他東西... –

回答

0

A BroadcastReceiver僅在其執行onReceive()方法期間存在。所以,每次廣播被觸發/接收時,這都會評估爲一個丟棄事件。要動態註冊/取消註冊BroadcastReceiver s,您必須記住onPause()中的接收器實例,以在onResume()期間再次註冊。

@Override 
protected void onPause() { 
    unregisterReceiver(mReceiver); 
    super.onPause(); 
} 

對於Activity

爲了從您的應用程序內註冊BroadcastReceiver,首先,從您的AndroidManifest.xml 文件刪除<receiver>標籤。然後,在onResume()中撥打registerReceiver(BroadcastReceiver receiver, IntentFilter filter)。在您的onPause()中使用unregisterReceiver(BroadcastReceiver receiver)取消註冊BroadcastReceiver

對於Service

從清單文件中刪除接收器標籤。然後,您可以使用onCreate()中的相同方法註冊您的BroadcastReceiver,然後取消註冊onDestroy()

接過借鑑:1:Unregister broadcast receiver 2:unregister receiver

您可以檢查here,它給你約的BroadcastReceiver S中的更多詳細信息。

仍然不是你的問題解決了,請讓我知道。

+0

所以我必須從onDestroy中刪除unregisterReceiver方法並在onPause中調用它?我必須從我的addProximityAlert中刪除registerReceiver? –

+0

您應該從onPause()方法註銷它。 –

+0

對不起,我在完成評論 –

0

我懷疑你的約束(POINT_RADIUS等)不被更新,因爲你檢索您的旗子「0」未決的意圖:

PendingIntent.getBroadcast(this, 0, intent, 0); 

LocationManager.addProximityAlert()需要你給它掛起的意圖,並設置重複使用它包含的意圖進行報警。如果您隨後撥打addProximityAlert(),PendingIntent與前一個匹配(根據Intent.filterEquals()),警報將不會更新,並且您的新約束不會生效。

要解決問題,您需要設置正確的標誌,以便掛起的意圖替換上一個意圖。

PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

的標誌被記錄在這裏(順便說一句,我認爲 '0' 是未定義的行爲):http://developer.android.com/reference/android/app/PendingIntent.html

NB,如果FLAG_UPDATE_CURRENT不工作,你可能需要FLAG_CANCEL_CURRENT代替。

+0

不能正常工作:(:( –