2013-06-11 59 views
1

所以,我有一個Android應用程序,要求從LocationManager類的GPS。 我有一個想要使用該數據的Activity以及實現了LocationListener的自定義類。 我已經寫了一些自定義方法來將GPS值返回給我的其他類。我應該從哪個類調用locationManger.removeUpdates()?

目前,我正在要求併發布我的Activity類的位置更新,而不是我的LocationListener類的實現......我認爲這是正確的方法,但我只想獲得任何反饋在生命週期等(實現LocationListener類不是一個Activity,所以我不認爲我甚至可以稱之爲onPause()等?)

這是Activity

package com.jessescott.sonicity; 

import android.app.Activity; 
import android.content.Context; 
import android.view.View; 
import android.widget.TextView; 
import android.location.Location; 
import android.location.LocationManager; 
import android.location.LocationListener; 


public class PlayActivity extends Activity { 

    // GLOBALS 
    private static final String TAG = "SoniCity"; 
    LocationManager locationManager; 
    MyLocationListener locationListener; 

    TextView latitude, longitude; 
    TextView ActualLatitude, ActualLongitude; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.play_layout); 

     // GPS 
     locationListener = new MyLocationListener(this);  


     // TextViews 
     latitude = (TextView) findViewById(R.id.Latitude); 
     longitude = (TextView) findViewById(R.id.Longitude); 

     ActualLatitude = (TextView) findViewById(R.id.ActualLat); 
     ActualLatitude.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.v(TAG, "Asking For New Latitude"); 
       ActualLatitude.setText(locationListener.getCurrentLatitude()); 
      } 
     }); 

     ActualLongitude = (TextView) findViewById(R.id.ActualLon); 
     ActualLongitude.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.v(TAG, "Asking For New Latitude"); 
       ActualLongitude.setText(locationListener.getCurrentLongitude());  
      } 
     }); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     // Stop GPS 
     locationManager.removeUpdates(locationListener); 
     locationManager = null; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 5, locationListener); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

} /* */ 

。 ..這是LocationListener實施N:

package com.jessescott.sonicity; 

    import android.content.Context; 
    import android.location.Location; 
    import android.location.LocationListener; 
    import android.os.Bundle; 
    import android.util.Log; 

    class MyLocationListener implements LocationListener { 

     private static final String TAG = "SoniCity"; 
     float currentLatitude  = 0; 
     float currentLongitude = 0; 

     public MyLocationListener(Context context) { 
      super(); 
     } 

     // Define all LocationListener methods 
     public void onLocationChanged(Location location) { 
     currentLatitude = (float)location.getLatitude(); 
     currentLongitude = (float)location.getLongitude(); 


     } 

     public void onProviderDisabled (String provider) { 
     Log.v(TAG, "Provider is " + provider); 
     } 

     public void onProviderEnabled (String provider) { 
     Log.v(TAG, "Provider is " + provider); 
     } 

     public void onStatusChanged (String provider, int status, Bundle extras) { 
     Log.v(TAG, "Status is " + status); 
     } 

     // Custom Methods 

     public String getCurrentLatitude() { 
      String lat = Float.toString(currentLatitude); 
      return lat; 
     } 

     public String getCurrentLongitude() { 
      String lon = Float.toString(currentLongitude); 
      return lon; 
     } 

    } /* */ 

我想,因爲我已經把它移到一個單獨的類(他們曾經是同一個),我只是想確保我打電話次請求/在正確的地方刪除。

回答

1

我沒有詳細看過你的代碼,但從我看到的對我來說看起來很好。 onResume()是註冊聽衆的好地方,onPause()是註銷它的正確地方,例如,電池壽命得到優化。

一對夫婦的事情要考慮前進:

  • 對於一個強大的應用程序,請務必注意,你從onStatusChangedonProviderEnabledonProviderDisabled獲得的信息。我已經看到了stackoverflow.com上的各種問題,其答案是關注狀態變化等。
  • 此外,爲了更好地估計位置,您可以考慮使用Location.accuracy值,因爲GPS位置估計的準確性可以換。一分鐘他們可能會非常準確,但隨後可見衛星發生變化,準確度可能突然降低。在我的應用程序中,我使用了一個簡單的卡爾曼濾波器,我在回答問題Smooth GPS data時發佈了代碼。
  • +0

    乾杯,非常感謝... –

    +0

    沒問題!如果您發現我的答案有用,您甚至可以將其標記爲有用和/或作爲答案:-)。 – Stochastically