2017-04-08 72 views
0

我正在開發一個應用程序,用於跟蹤應用程序運行時用戶在geofence中的移動。主要活動(M)啓動並綁定到GeofenceService(S),然後統計用戶在指定地理圍欄內所採取的步驟數。在應用程序kill時停止服務

我希望一旦用戶移出地理圍欄或應用程序被終止,服務就會被銷燬。要停止該服務,當應用程序被殺死了,我乾脆取消綁定服務,然後調用stopservice()上S.

這裏去的主要活動代碼銷燬S.

public void onDestroy() 
{ 
    super.onDestroy(); 
    Log.d(TAG, "onDestroy of main activity"); 
    if(isGeofenceBound){ 
     Log.d(TAG, "unbinding geofence service"); 
     unbindService(mGeofenceConnection); 
     isGeofenceBound = false; 
    } 
    stopService(new Intent(getApplicationContext(), GeofenceService.class)); 
    Log.d(TAG, "after calling stop service on geofenceservice in main activity"); 
} 

這裏那張onDestroy() S.

的方法
public void onDestroy(){ 

    if(mBound){ 
     unbindService(mStepConnection); 
     mBound = false; 
    } 
    stopPedometerService(); 
    googleApiClient.disconnect(); 
    Log.d(TAG, "before super onDestroy of geofence service"); 
    stopSelf(); 

    super.onDestroy(); 
    Log.d(TAG, "After super onDestroy of geofence service"); 
} 

而這裏的服務

<service android:name=".geofencing.GeofenceService" 
      android:stopWithTask="true"/> 
清單代碼210

從android最近列表中清除應用程序後,我得到了android studio monitor中上面代碼中提到的所有日誌語句,但是該服務似乎保持活動狀態,因爲在應用程序重新啓動時,其變量狀態從最後開始。

+0

「它的變量狀態是從最後一次開始保存的」 - 什麼變量狀態?這些變量在哪裏申報?他們是常規字段還是「靜態」字段? – CommonsWare

+0

變量在Geofence服務中聲明。它們是靜態變量。 – forcehandler

+0

我注意到,當我關閉應用程序而不啓動Geofence'服務'時,主要活動並沒有調用它的'onDestroy()'方法,但是當啓動後應用程序關閉時,onDestroy()服務。 – forcehandler

回答

0

其變量狀態從最後開始被保留。

According to your comment,這些都是static領域。這樣的領域爲這個過程的生命而生存。您的服務被銷燬的事實對您的流程沒有直接的影響。如果您在過程仍在進行時再次啓動您的服務,那麼這些static字段將具有他們曾經擁有的任何值。

如果您不想要這種行爲,請從這些字段中刪除static關鍵字。

+0

好吧,我現在看到如何使字段非靜態會幫助我,但該服務也正在偵聽GPS狀態更改廣播,並且我不希望服務在應用程序未運行時響應此類廣播。 – forcehandler

+0

@forcehandler:「但服務也在收聽GPS狀態變化廣播」 - 我沒有看到與廣播有關的問題中的任何代碼。 – CommonsWare

相關問題