1

LocationManagerそのため、クラスから GPS を要求する Android アプリケーションがあります。Activityそのデータを使用したい と、 を実装するカスタム クラスがありますLocationListener。GPS 値を他のクラスに返すカスタム メソッドをいくつか作成しました。

Activity現在、クラスの実装ではなく、クラスからの場所の更新を求めてリリースしていますLocationListener...これは正しい方法だと思いますが、ライフサイクルなどに関するフィードバックを得たかっただけです. (実装するクラスは でLocationListenerはないので、etc を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実装です:

 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;
      }

    } /* */

私はそれを別のクラスに移動したので(以前は同じクラスでした)、適切な場所でリクエスト/削除を呼び出していることを確認したいだけです。

4

1 に答える 1

1

私はあなたのコードを詳しく見ていませんが、私が見たところ、私には問題ないようです。 onResume()は、リスナーを登録するのに適した場所であり、リスナーonPause()を登録解除するのに適した場所です。これにより、たとえばバッテリー寿命が最適化されます。

今後考慮すべき点がいくつかあります。

  • onStatusChanged堅牢なアプリの場合は、 、onProviderEnabledおよびから得られる情報に注意してくださいonProviderDisabled。stackoverflow.com でさまざまな質問を見てきましたが、その答えはステータスの変化などに注意を払うことでした。
  • また、位置をより正確に推定するには、Location.accuracy 値を使用することを検討してください。これは、GPS 位置推定の精度が変化する可能性があるためです。1分間は非常に正確かもしれませんが、その後、目に見える衛星が変化し、精度が突然大幅に低下する可能性があります. 私のアプリでは、これに単純なカルマン フィルターを使用し、そのコードを質問Smooth GPS dataへの回答に投稿しました。
  • 于 2013-06-11T18:34:12.627 に答える