Главное приложение убито после запуска активности просмотра улиц - PullRequest
0 голосов
/ 27 января 2011

В моем коде я начинаю новое действие для просмотра улиц.

Intent streetView = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(streetView);

Прекрасно запускает вид на улицу. Если я ничего не делаю, я могу нажать кнопку «Назад», и мое приложение сидит там, ожидая, что ничего не изменилось.

Однако, если я немного использую вид улицы, осматриваюсь и перемещаю вид, я вижу это в logcat:

01-27 10: 53: 27.526: INFO / ActivityManager (1079): недостаточно памяти: больше нет фоновых процессов.

01-27 10: 53: 27.636: DEBUG / dalvikvm (32218): GC_FOR_MALLOC освободил 3054 объекта / 198608 байт за 655 мс

01-27 10: 53: 27.831: DEBUG / dalvikvm (32164): GC_FOR_MALLOC освободил 1054 объекта / 51664 байта за 342 мс

01-27 10: 53: 27.862: INFO / dalvikvm-heap (32164): увеличение кучи (случай фрагмента) до 3,665 МБ для выделения 87396 байт

01-27 10: 53: 27.878: INFO / ActivityManager (1079): процесс com.favorite.me (pid 32135) умер.

01-27 10: 53: 27.878: INFO / ActivityManager (1079): недостаточно памяти: больше нет фоновых процессов.

01-27 10: 53: 27.482: INFO / ActivityManager (1079): процесс com.myapp.app (pid 31481) умер.

01-27 10: 53: 27.490: INFO / WindowManager (1079): WIN DEATH: Window {44c68ba8 com.myapp.app/com.myapp.app.MyLocation paused = false}

Затем, когда я нажимаю кнопку «Назад», чтобы вернуться к своему приложению, кажется, что все переменные были сброшены до нуля, как будто я потерял состояние моего приложения. Единственный способ исправить это - снова нажать кнопку «Назад» и снова запустить это действие.

Судя по тому, что я могу сказать, он не вызывает методы onpause () или onSaveInstanceState (), а операционная система убивает мое приложение из памяти для запуска просмотра улиц.

Есть ли что-то, что мне нужно сделать по-другому?

Вот мои методы oncreate, onRestoreInstanceState и onSaveInstanceState:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
        sLong = savedInstanceState.getDouble("sLong");
        sLat = savedInstanceState.getDouble("sLat");
        sMapStyle = savedInstanceState.getBoolean("sMapStyle");
        sMapUpdate = savedInstanceState.getBoolean("sMapUpdate");
        sMapStreet = savedInstanceState.getBoolean("sMapStreet");
        sFirstTime = savedInstanceState.getBoolean("sFirstTime");
        locationAvailable = savedInstanceState.getBoolean("locationAvailable");
        sGPSFlag = savedInstanceState.getBoolean("sGPSFlag");
        sMessage = savedInstanceState.getString("sMessage");
        sMap = savedInstanceState.getString("sMap");
        sGPS = savedInstanceState.getString("sGPS");
        sAddressIn = savedInstanceState.getString("sAddressIn");
        sGPSLat = savedInstanceState.getString("sGPSLat");
        sGPSLong = savedInstanceState.getString("sGPSLong");
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
      super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putDouble("sLong",sLong);
        savedInstanceState.putDouble("sLat",sLat);
        savedInstanceState.putBoolean("sMapStyle",sMapStyle);
        savedInstanceState.putBoolean("sMapUpdate",sMapUpdate);
        savedInstanceState.putBoolean("sMapStreet",sMapStreet);
        savedInstanceState.putBoolean("sFirstTime",sFirstTime);
        savedInstanceState.putBoolean("locationAvailable",locationAvailable);
        savedInstanceState.putBoolean("sGPSFlag",sGPSFlag);
        savedInstanceState.putString("sMessage",sMessage);
        savedInstanceState.putString("sMap",sMap);
        savedInstanceState.putString("sGPS",sGPS);
        savedInstanceState.putString("sAddressIn",sAddressIn);
        savedInstanceState.putString("sGPSLat",sGPSLat);
        savedInstanceState.putString("sGPSLong",sGPSLong);
    }

Думаю, я могу понять, почему это происходит. Все еще не уверен, как исправить это еще. Я установил несколько сообщений отладки и вижу, как выполняются методы onRestoreInstanceState() и onSaveInstanceState().

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

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Возможно, вы не правильно используете onSaveInstanceState.

  1. Убедитесь, что вы записали переменные, представляющие состояние вашего приложения, в Bundle, переданный вам в onSaveInstanceState.

  2. в вашей деятельности onCreate, используйте данный Пакет, чтобы восстановить ваше состояние.В качестве альтернативы вы можете сделать это в onRestoreInstanceState.

См. этот вопрос stackoverflow для полного примера.

1 голос
/ 28 января 2011

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

Взгляните на Сохранение постоянного состояния на сайте разработчика Android. Они предполагают, что может потребоваться более агрессивное сохранение состояния вашего экземпляра - это защитит от потери состояния, когда ваше приложение будет убито Android:

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

Все, что я могу предложить, - это явно сохранить свое состояние экземпляра перед запуском действия просмотра улиц.

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

Также обратите внимание по той же ссылке:

Для onRestoreInstanceState:

Этот метод вызывается после onStart () когда деятельность ведется повторно инициализирован из ранее сохраненного состояние, данное здесь в savedInstanceState.

Сейчас начинается:

Вызывается после onCreate (Bundle) - или после onRestart (), когда активность был остановлен, но теперь снова отображается для пользователя.

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

0 голосов
/ 30 апреля 2011

В onSaveInstanceState функция "super.onSaveInstanceState" должна быть в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...