Выполнение паузы активности, которая не возобновляется после воссоздания метода
У меня есть проект для HoneyComb, и я получаю сообщение об ошибке после использования метода recreate() методом onResum() в моей основной деятельности.
11-10 22:05:42.090: E/ActivityThread(1917): Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main}
11-10 22:05:42.090: E/ActivityThread(1917): java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main}
11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2517)
11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2505)
11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2483)
11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.access$700(ActivityThread.java:122)
11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
11-10 22:05:42.090: E/ActivityThread(1917): at android.os.Handler.dispatchMessage(Handler.java:99)
11-10 22:05:42.090: E/ActivityThread(1917): at android.os.Looper.loop(Looper.java:132)
11-10 22:05:42.090: E/ActivityThread(1917): at android.app.ActivityThread.main(ActivityThread.java:4123)
11-10 22:05:42.090: E/ActivityThread(1917): at java.lang.reflect.Method.invokeNative(Native Method)
11-10 22:05:42.090: E/ActivityThread(1917): at java.lang.reflect.Method.invoke(Method.java:491)
11-10 22:05:42.090: E/ActivityThread(1917): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
11-10 22:05:42.090: E/ActivityThread(1917): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
11-10 22:05:42.090: E/ActivityThread(1917): at dalvik.system.NativeStart.main(Native Method)
Я создаю новый проект, чтобы показать вам, что произойдет.
Вы можете найти его на http://xp-dev.com/svn/RecreateError/trunk/
Я не знаю, в чем моя вина, но я запускаю Activity и записываю жизненный цикл Activity.
Результат:
11-10 22:26:45.960: I/seasons log(2274): onCreate()
11-10 22:26:45.990: I/seasons log(2274): onStart()
11-10 22:26:45.990: I/seasons log(2274): onResume()
Теперь я нажимаю значок панели действий, чтобы активировать флаг воссоздания и перейти на другое приложение...
11-10 22:30:26.390: I/seasons log(2274): onPause()
11-10 22:30:27.080: I/seasons log(2274): onStop()
И вернемся к моей активности с активированным флагом refreate, что будет сделано rereate() at onResume().
11-10 22:33:05.500: I/seasons log(2274): onCreate()
11-10 22:33:05.510: I/seasons log(2274): onStart()
11-10 22:33:05.510: I/seasons log(2274): onResume()
11-10 22:33:05.510: I/seasons log(2274): onPause()
OnPause? Но моя активность видна, что я делаю неправильно? Правильный статус не находится в режимеResume()?
И теперь, если я перейду на другое приложение, я получу ошибку.
Спасибо за ваше время и извините за мой плохой английский.
В настоящее время я не понимаю, как такие приложения, как File Manager HD, выполняют это действие.
Две операции: основная активность A, активность B с предпочтением. Фрагмент как основной контент.
Один из вариантов, который изменяет тему между Holo и Holo.Light,
Действие B изменяется с помощью метода OnSharedPreferenceChangeListener
в PreferenceFragment, но когда мы возвращаемся к методу Main Activity recreate()
при onResume()
не удается, как это сделать?
Я смущен. К сожалению.
Ответы
Ответ 1
Для этого используйте обработчик:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what==MSG_RECREATE)
recreate();
}
};
@Override
protected void onResume() {
if(condition) {
Message msg = handler.obtainMessage();
msg.what = MSG_RECREATE;
handler.sendMessage(msg);
}
}
Это больше не будет разбиваться.
Ответ 2
Я не знаю, является ли это причиной ваших проблем, но вы не сравниваете такие строки в Java,
protected void onResume() {
...
if (recreate == "S") {
recreate = "N";
recreate();
}
Используйте if ("S".equals(recreate))
вместо этого.
Ответ 3
Вы никогда не должны звонить onPause onCreate onResume
и т.д. самостоятельно. Вам не нужно использовать recreate()
для того, что вы хотите сделать, поместите код инициализации в другое место, если он нуждается в обновлении. Кроме того, используйте целое число для хранения состояния программы вместо строки, а затем объявите некоторые конечные переменные для ссылки, например.
public final int RECREATE_ON = 1;
public final int RECREATE_OFF = 2;
private int recreate = RECREATE_OFF;
...
if(recreate==RECREATE_ON){
recreate();
}
Помните, что делает recreate():
Объяснить эту активность для нового экземпляра. Это приводит к по существу, в том же потоке, что и при создании Activity из-за изменение конфигурации - текущий экземпляр будет проходить через его жизненный цикл к onDestroy() и новый экземпляр, созданный после него.
Вот почему вы получаете сообщение onPause
.