2013-05-23 7 views
2

Это мой второй подход к решению этой проблемы, пока не повезло.фрагмент жизненного цикла, когда убит pid

У меня есть MainActivity, который является активностью запуска.

в пределах своего метода onCreate. Я проверяю, инициализирован ли static endpoints.

Если нет -> запустить службу и зарегистрировать приемник (показать загрузчик) ->onReceive показывают некоторые фрагменты

Если да -> показать фрагменты

Эта часть прекрасно работает.

Итак, в чем проблема?

У меня есть MainActivity с некоторыми фрагментами. Затем я положил процесс на задний план и сделал

adb shell am kill com.myapp 

PID убит. Итак, теперь я хочу снова запустить приложение. Android пытается воссоздать состояние приложения смысл стрельбы:

(Для простоты предположим, что MainActivity был только один фрагмент видимого во время бега)

MainActivity : onAttachFragment() 
Fragment  : onAttach() 
Fragment  : onCreate() 
MainActivity : onCreate() 
Fragment  : onCreateView() 
... 

Проблема заключается в следующем: Когда MainActiviy.onCreate видит, что статика не инициализируется то он вызывает вызов Service и ждет ответа. Это обычный сценарий запуска. Но на этот раз воссоздается Fragment, а его жизненный цикл смешан с жизненным циклом MainActivity. Becasuse все происходит асинхронный я не могу предотвратить Fragment «s onCreate(), onResume(), onStart(), onCreateView() от стрельбы .. и некоторые из этих методов требуют статики быть инициализирована (MainActivity не закончил еще процесс инициализации), который вызывает сбой

Итак, мой вопрос:: как я могу предотвратить Fragment от воссоздания в этом сценарии? так что это предпочтительно чистый старт MainActivity. Любые намеки на этот момент будут оценены.

не выполнимые решения или «Я пробовал» Решения:

  • СОХРАНИТЬ статические конечные точки на телефоне -> не может произойти, потому что конечные точки динамически изменяются каждые 5 минут

  • singleTop, singleTask для MainActivity

ответ

0

мне удалось преодолеть это делать что-то вроде этого в MainActivity.onCreate():

if(!MyStatics.isInitialized()) 
    super.onCreate(null); 
else 
    super.onCreate(savedInstanceState); 

Это вызывает перезапуск Activity без воссоздающих фрагментов

+0

Это может быть плохой пользовательский опыт, если у фрагмента есть пользовательский интерфейс! –

0

В режиме MainActivity onCreate проверьте, savedInstanceState is null or not.

Если that is not null the don't start the service и создать фрагменты. Примечание. Вы также не должны вызывать setContentView, так как это отбросит сохраненные экземпляры для представлений и даже фрагмента.

И в каждом individual Fragment save the state фрагмента и restore it если saveInstance Bundle в OnCreate, onCreateView и onAttach является not null.

+1

Благодаря Вивек, им уже делать вещи с вашего 1-го пункта. Что касается фрагментов .. это не их состояние, это проблема .. проблема в том, что я не могу остановить их отдых, потому что это происходит до MainActtivity onCreate – AndroidGecko

0

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

+0

Спасибо Eldhose, как я удаляю фрагмент из фрагментов onCreate()? – AndroidGecko

+0

Внутри фрагмента вы можете получить экземпляр действия как контекст. Используя этот контекст, получите транзакцию фрагмента и вызов remove (this); –

+0

транзакции асинхронны, методы все равно срабатывают. Я попробовал это с выполнением транзакций, но все равно не повезло. – AndroidGecko

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