簡體   English   中英

執行重新創建方法后未恢復的活動暫停

[英]performing pause of activity that is not resumed after recreate method

我有一個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()

並返回我的Activity with recreate flag激活將在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,活動B,以PreferenceFragment為主要內容。

在Holo.Light之間更改主題的一個選項.Light,活動B在PreferenceFragment中使用OnSharedPreferenceChangeListener方法更改,但是當我們回到主活動onResume() recreate()方法失敗時,該怎么做?

我很困惑。 抱歉。

為此,請使用處理程序:

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

這不會再崩潰了。

我不知道這是否是你問題的原因,但你不能在Java中比較像這樣的字符串;

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

請改用if ("S".equals(recreate))

你永遠不應該自己調用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消息的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM