执行重新创建方法后未恢复的活动暂停

时间:2011-11-10 21:40:15

标签: android android-lifecycle

我有一个HoneyComb的项目,我在主Activity中的onResum()方法上使用了recreate()方法后出错。

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()

返回我的活动,重新创建标志激活将在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?但我的活动是可见的,我做错了什么?正确的状态不是onResume()?

现在,如果我换到另一个应用程序,我会收到错误。

感谢您的时间,对不起我的英语不好。


此时我不明白文件管理器HD等应用程序如何执行此操作。

两项活动:主要活动A,以PreferenceFragment为主要内容的活动B.

改变Holo和Holo.Light之间主题的一个选项, 活动B在PreferenceFragment中使用OnSharedPreferenceChangeListener方法更改,但当我们回到recreate()处的主要活动onResume()方法失败时,该怎么做?

我很困惑。遗憾。

3 个答案:

答案 0 :(得分:3)

为此,请使用处理程序:

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);
    }
}

这不会再崩溃了。

答案 1 :(得分:0)

我不知道这是否是导致问题的原因,但你不能在Java中比较这样的字符串;

protected void onResume() {
    ...
    if (recreate == "S") {
        recreate = "N";
        recreate();
    }

改为使用if ("S".equals(recreate))

答案 2 :(得分:0)

你永远不应该自己打电话给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()正在做的事情:

  

导致使用新实例重新创建此活动。结果   基本上与由于a创建Activity时相同的流程   配置更改 - 当前的实例将通过它   生命周期到onDestroy(),然后在它之后创建一个新实例。

这就是您收到onPause消息的原因。