Оптимизируйте операцию периодического получения местоположения пользователя Android

Я пытаюсь разработать приложение для Android, которое будет использовать карту Google и получать местоположение пользователя каждые 5 минут и отображать его на карте.

У меня есть три вопроса:
– Как запланировать службу намерения, чтобы местоположение было получено через 5 минут?
– Подходит ли мой код для достижения этой цели?
– Как оптимизировать использование батареи с помощью Это?

Спасибо
Вот мой код :

public class RetrieveActivity extends AppCompatActivity
    implements
    OnMapReadyCallback,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    GoogleMap.OnMyLocationButtonClickListener {

public static LatLng mCurrentLatLn = null;
MapFragment mMapFragment;
// The map used in MapFragment
private GoogleMap mGoogleMap;
private GoogleApiClient mGoogleApiClient;
private String KEY_CURRENT_LAT_LONG = "KEY_CURRENT_LAT_LONG";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("safer", "onCreate ");

// startService(); setContentView (R.layout.activity_main);

    buildToolBar();
    // Create a GoogleApiClient instance
    buildGoogleApiClient();

    mMapFragment = (MapFragment) getFragmentManager()
            .findFragmentById(R.id.map);

    mMapFragment.getMapAsync(this);

}

@Override
protected void onResume() {
    super.onResume();
    mGoogleApiClient.connect();
}

@Override
public void onPause() {
    super.onPause();
    Log.d("safer", "onPause ");
    mGoogleApiClient.disconnect();
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    mCurrentLatLn = savedInstanceState.getParcelable(KEY_CURRENT_LAT_LONG);

}

/**
 * Utilitary method used to initialize our vars
 */
protected void buildGoogleApiClient() {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addApi(LocationServices.API)
            .build();
    mGoogleApiClient.connect();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

private void buildToolBar() {
    // Handle Toolbar
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    if (toolbar != null) {
        // Set the toolbar title
        TextView title = (TextView)     toolbar.findViewById(R.id.toolbar_title);
        title.setText(R.string.app_name);
        title.setTextSize(28.0f);


        // Set the toolbar navigation icon
        toolbar.setNavigationIcon(R.drawable.ic_menu);

        // Use the toolbar as Actionbar
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(false);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

    }
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    mGoogleMap.setMyLocationEnabled(true);
    mGoogleMap.setBuildingsEnabled(true);
    mGoogleMap.setOnMyLocationButtonClickListener(this);
    UiSettings uiSettings = mGoogleMap.getUiSettings();
    uiSettings.setCompassEnabled(false);
    uiSettings.setTiltGesturesEnabled(false);
    uiSettings.setZoomControlsEnabled(true);
}


@Override
public void onConnected(Bundle bundle) {
    Location l = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (l != null) {
        mCurrentLatLn = new LatLng(l.getLatitude(), l.getLongitude());
        moveCameraTo(mCurrentLatLn);

    }
}


@Override
public void onConnectionSuspended(int i) {
}

@Override
public boolean onMyLocationButtonClick() {

    if (mCurrentLatLn != null) {
        moveCameraTo(mCurrentLatLn);
    } else {
        Toast.makeText(RetrieveActivity.this, "Please enable location service...", Toast.LENGTH_SHORT).show();
    }


    return true;
}

// Method to start the service
public void startService() {
    Log.d("safer", "startService ");
    startService(new Intent(RetrieveActivity.this, FetchingData.class));
}

private void moveCameraTo(LatLng position) {
    CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(position)
            .zoom(Constants.MAP_ZOOM_DEFAULT_LEVEL)     // Sets the zoom
            .tilt(Constants.MAP_TILT)                   // Sets the tilt of the camera to 30 degrees
            .build();
    mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

}


person Coccoonx    schedule 11.09.2015    source источник


Ответы (2)


Как запланировать службу намерений, чтобы местоположение было получено через 5 минут?

Служба намерений работает для конкретной задачи. Вы должны думать, когда вам нужно местоположение! Если ваш пользователь остается в приложении, и вам нужно снова показывать местоположение на карте каждые 5 минут, вы должны сделать это в своей деятельности. Если пользователь находится вне приложения и вам нужно получить местоположение, просто используйте Сервис и продолжайте получать местоположение, заставив его подождать 5 минут. Также вы можете снова запустить службу Intent с помощью диспетчера тревог и получить местоположение!

Подходит ли мой код для достижения этой цели?

Попросите вашего пользователя с помощью переключателя отключить эту функцию для хорошей практики. Кстати, все выглядит хорошо!

Как я могу оптимизировать использование батареи с его помощью?

Хотя батарея разряжается очень быстро, когда вы делаете такие вещи. Получите процент заряда батареи и продлите время, если оно низкое! Делайте тяжелые вещи, когда пользователь заряжает свое устройство или когда он не использует его, например, после полуночи!

person Dr. aNdRO    schedule 11.09.2015

Как запланировать службу намерения, чтобы местоположение было получено через 5 минут?

Используйте AlarmManager и запланируйте способ получения местоположения, запустив службу

Подходит ли мой код для достижения этой цели?

Вы не используете AlarmManager , поэтому нет. Также просто FYI Handler не идеален для более длительного периода времени.

Как я могу оптимизировать использование батареи с его помощью?

Используйте диспетчер тревог, он будет группировать запросы по мере необходимости, что сэкономит заряд батареи, но ваши запросы могут быть задержаны. Прочтите документацию.

person JoxTraex    schedule 11.09.2015