Выполнение паузы активности, которая не возобновляется после воссоздания метода

У меня есть проект для 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.