Жизненный цикл активности Android и жизненный цикл процесса

После почти года использования NDK я понял, что жизненный цикл Process в Android отличается от жизненного цикла Activity.

Точнее моя родная библиотека грузится в OnCreate но в onDestroy не выгружается (даже не знаю можно ли тут выгрузить нативную библиотеку), но при следующем OnCreate это все тот же процесс, так что все глобальные переменные из моей родной библиотеки все еще живы с сохраненным состоянием. То же самое и для статических переменных в Java.

Это было довольно хорошо с Android 2.3, но недавно я перешел на Android 4.2.2 и заметил кое-что действительно странное. Теперь можно убить процесс, а активность просто вызвать onRestart() (или это то, что я предполагаю из чтения журналов), что, если честно, довольно странно, потому что я предполагаю, что onCreate будет вызываться сразу после того, как процесс создан, но он держит другую вкладку, потому что он думает о «действиях», а не об процессах. Таким образом, в основном, если я приостанавливаю одно из своих приложений на очень долгое время (скажем, 1+ часов) и возвращаюсь к нему, это обычно приводит к сбою.

Выдержка из журнала устройства:

04-14 04:41:34.886  2376  2376 I am_on_paused_called: [0,com.re3.benchmark.AboutActivity]
04-14 05:06:26.128   386   594 I am_proc_died: [0,2376,com.re3.benchmark]
04-14 13:19:44.256   386   538 I am_proc_start:[0,4761,10062,com.re3.benchmark,activity,com.re3.benchmark/.AboutActivity]
04-14 13:19:44.295   386   595 I am_proc_bound: [0,4761,com.re3.benchmark]
04-14 13:19:44.397   386   595 I configuration_changed: 5248
04-14 13:19:44.459   386   595 I am_restart_activity: [0,1115347592,8,com.re3.benchmark/.AboutActivity]
04-14 13:19:44.701  4761  4761 I am_on_resume_called: [0,com.re3.benchmark.AboutActivity]
04-14 13:19:44.881   386   401 I am_activity_launch_time: [0,1115347592,com.re3.benchmark/.AboutActivity,631,631]
04-14 13:19:52.725   386   595 I am_crash: [4761,0,com.re3.benchmark,8961606,java.lang.NullPointerException,NULL,REFramework.java,330]
04-14 13:19:52.725   386   595 I am_finish_activity: [0,1115347592,8,com.re3.benchmark/.AboutActivity,crashed]
04-14 13:19:52.772   386   595 I am_pause_activity: [0,1115347592,com.re3.benchmark/.AboutActivity]

PS: я понимаю, что сбой происходит в моем коде, но мой код на самом деле не обрабатывает onRestart как первую функцию, которая будет вызываться во всем процессе (например, она обходит инициализации моей родной библиотеки, так как я ожидаю, что onCreate будет вызываться первым ).


person RelativeGames    schedule 14.04.2013    source источник


Ответы (1)


Вероятно, вам следует загружать нативную библиотеку в Application.onCreate, а не в Activity.

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

person MaciejGórski    schedule 14.04.2013
comment
Да, согласен, но на самом деле он зависал при переходе от AboutActivity к MainActivity. AboutActivity просто показывает какой-то текст, он не взаимодействует с родной библиотекой. Иногда я оставляю его открытым в MainActivity, где я загружаю библиотеку, и когда я возвращаюсь к ней, она падает, я нажимаю «ОК», и странно то, что она снова запускает приложение, на этот раз с onCreate и прочее. Обычно, когда приложение выходит из строя, оно не перезапускается таким образом. - person RelativeGames; 15.04.2013