2017-04-14 22 views
4

我正在開發一個應用程序,該應用程序在啓動時獲取用戶位置。我正在使用Smart Location Library來獲取位置和反向地理編碼。但主要問題在於即使在應用程序關閉後,GPS仍會顯示在通知中。我檢查了堆棧跟蹤,但沒有發現任何泄露的窗口異常。 我使用此代碼來獲取我的位置..Android Smart Location Library在應用程序關閉後總是連接到GPS

private void getMyLocation(){ 
    final long mLocTrackingInterval = 1000000 * 5; // 5 sec 
    float trackingDistance = 1000 * 10; 
    LocationAccuracy trackingAccuracy = LocationAccuracy.HIGH; 
    LocationParams.Builder builder = new LocationParams.Builder() 
       .setAccuracy(trackingAccuracy) 
       .setDistance(trackingDistance) 
       .setInterval(mLocTrackingInterval); 
    SmartLocation.with(mContext) 
       .location(provider) 
       // .continuous() 
       .oneFix() 
       .config(builder.build()) 
       .start(this); 
} 

@Override 
public void onLocationUpdated(Location location) { 
    SmartLocation.with(mContext).geocoding() 
      .reverse(location,new OnReverseGeocodingListener() { 
       @Override 
       public void onAddressResolved(Location location, List<Address> results) { 
        if (results.size() > 0) { 
         mAddressList=results; 
         mLocation=location; 
         tvLocation.setText(results.get(0).getAddressLine(0)+"\n"+results.get(0).getAddressLine(1)); 
        } 
       } 
      }); 
} 

和主actvity的onStop()方法..

@Override 
protected void onStop() { 
    super.onStop(); 
    SmartLocation.with(mContext).location(provider).stop(); 
    SmartLocation.with(mContext).geocoding().stop(); 
} 

編輯

我使用這個povider。我也試過其他提供者。但仍然是相同的結果。

private LocationGooglePlayServicesWithFallbackProvider provider=new LocationGooglePlayServicesWithFallbackProvider(mContext); 

我試了很多,但無法弄清楚是什麼實際問題。任何幫助,將不勝感激。謝謝

+0

您使用的是什麼'provider'? – azizbekian

+0

@azizbekian我使用'LocationGooglePlayServicesWithFallbackProvider'也嘗試過其他提供者 –

+0

使用SmartLocation.with(context).location()。stop();停止位置監聽。 –

回答

2

對於一個應用程序保持響應很多事情都做了異步。這是一件好事。它看起來像你使用的圖書館那樣工作。請參閱Sample of MainActivity.javaonActivityResult()是你正在尋找的。

那麼,它什麼時候回來的數據呢?我們只是不知道......

那麼你如何阻止它呢?那麼,這是Android的另一部分。請看這Android Activity Lifecycle。你會注意到雖然onStop()通常調用,但這並不是用戶做其他事情時的第一件事情。如果您等待onStop()被呼叫,您不知道這是什麼時候。 如果用戶離開應用程序並手動將其從內存中刪除,則只會確保onPause()被調用,其餘以我的經驗爲準。

所以,如果你想在用戶離開時(但你的應用程序仍在內存中,準備好接收通知)殺死GPS,你可以在onPause()中這樣做。類似這樣的:

@Override 
protected void onPause() { 
    super.onPause(); 

    if (SmartLocation == still_running) { // pseudo code 
     SmartLocation.with(mContext).location(provider).stop(); 
     SmartLocation.with(mContext).geocoding().stop(); 
    } 
} 
+0

所以,基本上,你聲稱'onStop()'是**不保證被調用,而'onPause()'是,這是不正確的。即使在用戶離開應用程序並將其從內存中手動刪除的情況下,也會調用onStop()。 – azizbekian

+0

這確實是我的經驗。我知道Docs說它每次都會被調用。但是它在我的應用程序中創建了一個錯誤,由於被稱爲,如果有的話,在其他時間,然後預期。 – Flummox

+0

你能發表一個簡單的項目來證明這種行爲嗎?我無法重現這一點。 – azizbekian

相關問題