9

位置情報を取得するアプリがあります。このアプリは、Gingerbread から携帯電話に展開される予定です。アプリが位置情報を取得すると、トースト メッセージがユーザーに表示されます。問題は、ユーザーが次のアクティビティに移動したときに、トースト メッセージがさらに 10 回表示されることです。

私はライフサイクルを正しく実装したと思います。

1) onCreate() でロケーション マネージャーを取得する 2) onResume() でロケーション リスナーを作成してマネージャーに渡す 3) onStop() で更新を削除する

Android > 4.x でこの問題を回避できることを理解しています

mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);

しかし、ジンジャーブレッドに対応する必要があるため、単一のリクエストを呼び出すことはapi 2.3.xではありません。Android 4 では問題なく動作しますが、ジンジャーブレッドでは onLocationChanged メソッドがさらに 10 回実行され続けます。

ジンジャーブレッドで onLocationChanged メソッドを強制的に 1 回だけ実行するにはどうすればよいですか?

ありがとう。

[編集] 次のアクティビティに移動すると、onlocationchanged メソッドが実行され続けますが、さらにアクティビティに移動すると、場所のリクエストが正常に削除されることに気付きました

@Override
protected void onStop() {
    mlocManager.removeUpdates(mlocListener); 
    mlocListener = null;
    super.onStop();
}

@Override
protected void onResume() {
    mlocListener = new MyLocationListener();
    if(isCompOptionsReceived == true){
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
            mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
        }else{
            mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);   
        }
    }        
    super.onResume();
}

private class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location loc) {
        //toast message
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status,                        Bundle extras) {
    }

}//end of MyLocationListener

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    nfcscannerapplication = (NfcScannerApplication) getApplication();
    sIs = savedInstanceState;
    setContentView(R.layout.entryscreen);
    mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
4

1 に答える 1

3

次のコードは、onStop メソッドではなく、onPause メソッドで実行する必要があります。

mlocManager.removeUpdates(mlocListener); 
mlocListener = null;

これにより、すべてのAndroidバージョンで修正されます。

于 2012-12-04T17:40:33.707 に答える