ОС Android при перезагрузке убивает активность root, пытается перезагрузить активность root и верхнего уровня.Есть ли способ остановить это поведение? - PullRequest
0 голосов
/ 25 февраля 2012

У меня давняя проблема с приложением, и я не смог ее решить.Мое приложение состоит из нескольких действий, которые вызывают друг друга с помощью StartActivityForResult.Затем они ждут ответа и действуют соответственно.Это нормально работает в нормальных условиях.У меня есть следующий набор в манифесте:

android:alwaysRetainTaskState = "true"

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

no longer want com.ddhsoftware.android.handbase 

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

02-24 17:29:04.376 E/AndroidRuntime(14318): FATAL EXCEPTION: main
02-24 17:29:04.376 E/AndroidRuntime(14318): java.lang.RuntimeException: Unable to start    activity ComponentInfo{com.ddhsoftware.android.handbase/com.ddhsoftware.android.handbase.ListViewScreen}: java.lang.NullPointerException
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.os.Handler.dispatchMessage(Handler.java:99)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.os.Looper.loop(Looper.java:130)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.lang.reflect.Method.invokeNative(Native Method)
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.lang.reflect.Method.invoke(Method.java:507)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-24 17:29:04.376 E/AndroidRuntime(14318): at dalvik.system.NativeStart.main(Native Method)
02-24 17:29:04.376 E/AndroidRuntime(14318): Caused by: java.lang.NullPointerException
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.util.Arrays$ArrayList. (Arrays.java:47)
02-24 17:29:04.376 E/AndroidRuntime(14318): at java.util.Arrays.asList(Arrays.java:169)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.widget.ArrayAdapter. (ArrayAdapter.java:125)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.ddhsoftware.android.handbase.ListViewScreen.setupViewSelector(ListViewScreen.java:821)
02-24 17:29:04.376 E/AndroidRuntime(14318): at com.ddhsoftware.android.handbase.ListViewScreen.onCreate(ListViewScreen.java:114)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-24 17:29:04.376 E/AndroidRuntime(14318): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-24 17:29:04.376 E/AndroidRuntime(14318): ... 11 more
02-24 17:29:04.386 W/ActivityManager( 96): Force finishing activity com.ddhsoftware.android.handbase/.ListViewScreen

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

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

Заранее благодарим за любые советы.

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Если у вас есть основное действие A, вызывающее вспомогательное действие B, где B ссылается на статические переменные A onCreate, и android убивает ваш процесс по причинам памяти, когда вы были в B:

-Когда пользователи откроют ваше приложение, оно сначала вызовет создание B и произойдет сбой, так как переменных A больше нет (процесс был остановлен).

Я справился с этим плавно, вот так:
на создаваемом B, проверьте, являются ли статические переменные A нулевыми. Если да, это означает, что у вас произошел сбой, вызванный памятью (как описано выше). Вы должны сделать следующее:

setResult(999); 
finish(); 
return;

Затем, A будет продолжать создавать, как обычно, и воссоздавать статические переменные. Вы можете установить onActivityResult для A:

if (resultCode==999) A.comeFromCrash = true;

, а затем в конце записи onCreate:

if (comeFromCrash) {запуск B; comeFromCrash = ложь;}

Затем вы можете добавить дополнительные переменные, чтобы контролировать, запускается ли B по умолчанию или после сбоя

0 голосов
/ 25 февраля 2012

Возможно, установите все действия для «прослушивания» действия «root». «Корневая» активность может передаваться при вызове его метода onStop, и, таким образом, уведомлять все другие действия о том, что пора умирать? Не уверен, что это поможет вам, это не очень хорошее решение в любом случае.

0 голосов
/ 25 февраля 2012

Смотрите здесь, чтобы предоставить вашему приложению реальную модель данных и не зависеть от действий, чтобы получить данные в ваших приложениях:

Ограничение размера Intent.putExtras?

...