Нужна помощь в понимании, куда поместить фрагмент кода, onCreate()/OnStart

Я пытался взглянуть на жизненный цикл активности, но до сих пор не понимаю, куда поместить свой код.

  1. В моем onCreate() я получаю местоположение GPS.
  2. Через некоторое время в приложении вызывается Camera Intent, а затем закрывается.
  3. Местоположение GPS снова получено (я предполагаю, что onCreate() выполняется снова?)

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


person Neeta    schedule 23.12.2011    source источник
comment
я думаю, что тоже столкнулся с этой проблемой, и это связано с тем, как вы вызвали запуск другого действия (в зависимости от того, какое действие принимает намерения камеры). я думаю, что происходит то, что обычно в вашей собственной деятельности вызываются только onStart() и onStop(). но я думаю, поскольку ваше приложение временно не является лучшим приложением, Android решает вызвать onCreate() в следующий раз, когда ваше приложение будет в фокусе. поправьте меня, если я ошибаюсь, я только предположил   -  person David T.    schedule 24.12.2011
comment
с другой стороны, вы уверены, что хотите получить местоположение GPS в onCreate()? это звучит как что-то вроде фоновой службы, в которой вы сначала проверяете, получили ли вы уже местоположение GPS.   -  person David T.    schedule 24.12.2011
comment
@ДэвидТ. Мне определенно нужно местоположение GPS при создании приложения, так как оно должно регистрировать местоположение пользователя в момент, когда они начинают его использовать.   -  person Neeta    schedule 24.12.2011


Ответы (5)


См. мой ответ о том, почему вы не можете просто "получить" позицию GPS для некоторого фона. Получение позиции GPS один раз в вашем методе onCreate() (с ленивой проверкой инициализации, чтобы увидеть, есть ли у вас координата GPS в случае нескольких вызовов onCreate()) может быть неправильным подходом для вашего приложения и может привести к ваше приложение будет принудительно закрыто операционной системой Android.

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

Если последнее известное местоположение не всегда достаточно хорошо для вашего приложения, вы не можете надежно ждать исправления в методе onCreate(), так как вы рискуете, что исправление местоположения займет слишком много времени, в результате чего система Android принудительно закроет ваше не отвечающее приложение. потому что он не вернулся из метода onCreate() вовремя. Вместо этого вам нужно запустить фоновую асинхронную задачу в методе onCreate() (проверив, что у вас еще нет такой асинхронной задачи), которая начинает прослушивать обновления местоположения до тех пор, пока не будет получено достаточно хорошее исправление, а затем запоминает это местоположение, остановка прослушивателей местоположения и, следовательно, отключение схемы GPS. Используйте код в строках:

private MyAsynchGpsLocationListener mGpsListener = null;

public ... onCreate() {
  if (mGpsListener == null) {
    mGpsListener = new MyAsynchGpsLocationListener();
    mGpsListener.start();
  }
}

someMethod() {
  if (mGpsListener != null) {
    Location myLocation = mGpsListener.getLocation();
    if (myLocation != null) {
      // Do something with a "good enough" location
    }
  }
}
person Colin    schedule 23.12.2011

Вы можете проверить это, если у вас уже есть действительное местоположение GPS, вы можете пропустить этот шаг и не получать его снова. Вы можете использовать SharedPreferences для хранения этого состояния.

Надеюсь это поможет!

person Dimitris Makris    schedule 23.12.2011
comment
Вы действительно не хотите хранить его в настройках. Если вы это сделаете, вы получите то же местоположение GPS через 3 недели, когда приложение снова запустится. - person zmbq; 24.12.2011
comment
Конечно, вы должны управлять этим. Например, в onDestroy вы должны установить для этого значения значение false, например. Я не собирался хранить его там и оставлять навсегда :) - person Dimitris Makris; 24.12.2011

onCreate() вызывается при создании активности. И onStart() вызывается сразу после onCreate().

Вы можете прочитать о жизненном цикле активности здесь: http://developer.android.com/reference/android/app/Activity.html

Для вашей проблемы вы можете переопределить onSaveInstanceState, метод, который поможет вам сохранить Bundle, а затем вернуть его в метод onCreate (параматер в onCreate — это этот Bundle).

protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    *Modify the bundle*
}

И если вы не можете сериализовать местоположение GPS, вы можете использовать:

@Override
public Object onRetainNonConfigurationInstance() {
     return objectYouNeed;
}

И чтобы получить этот объект, используйте getLastNonConfigurationInstance().

Надеюсь, поможет!

person Elad92    schedule 23.12.2011

Вы должны сохранить местоположение GPS в данных экземпляра, которые затем передаются обратно в onCreate в случае перезапуска активности. Место для хранения находится в onSaveInstance

person zmbq    schedule 23.12.2011

Поместите его ТОЛЬКО в onCreate().

Теперь, если вы думаете, что он вызывается несколько раз, вы не можете сделать что-то, чтобы проверить, есть ли он у вас уже. Такие как

onCreate(){

//other code

    if(GpsStuff == null)
    {
        //get gps position
    }
}
person Graham Smith    schedule 23.12.2011