2011-01-27 2 views
0

В моем коде я начинаю новую деятельность для просмотра улиц.Главное приложение убито после запуска деятельности по просмотру улиц

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

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

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

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

01-27 10: 53: 27,636: ОТЛАДКА/dalvikvm (32218): GC_FOR_MALLOC освободил 3054 объектов/198608 байт в 655ms

01-27 10: 53: 27.831: ОТЛАДКА/dalvikvm (32164): GC_FOR_MALLOC освободил 1054 объектов/51664 байт 342ms

01-27 10: 53: 27.862: INFO/dalvikvm-куча (32164): Grow кучи (осколочный случае) 3.656MB для распределения 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 СМЕРТЬ: Окно {44c68ba8 com.myapp.app/com.myapp.app.MyLocation паузу = ложь}

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

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

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

Вот мой 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() для запуска до моего кода?

+0

Откуда вы знаете, что 'onpause()' и 'onSaveInstanceState()' не вызываются? Вы пытаетесь сохранить свое состояние в одном (или обоих) этих методах? Вы регистрируете их? –

+0

Из logcat он сообщает мне pause = false. Таким образом, это не похоже на работу onpause(). Также я помещаю переменные, которые я пытаюсь сохранить в моем методе onSaveInstanceState(). – Brian

ответ

2

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

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

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

См. Вопрос this stackoverflow для полного примера.

+0

Несмотря на то, что я сохраняю их в onSaveInstanceState, он по-прежнему показывает null после того, как я возвращаюсь из активности Streetview, когда вижу в logcat, что он убил мой процесс. – Brian

+0

У меня был мозговой шторм прошлой ночью, когда я работал с 'onRestoreInstanceState()', и я смог вызвать на самом деле вызов некоторого кода, который мне нужен в этом методе, пропустив необходимость его вызова в 'onCreate()' снова , Спасибо за предложение! – Brian

1

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

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

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

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

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

Также отметим, из той же ссылке:

Для onRestoreInstanceState:

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

Теперь OnStart:

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

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

0

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

Смежные вопросы