2013-11-05 49 views
3

首先,我有兩項活動:Splash和MainActivity(僅支持肖像)。在MainActivity中,我有許多片段使用Slide菜單。我想在用戶離開MainActivity時保留當前片段。這裏是我的嘗試:只有在發佈模式下按住HOME時活動纔會死亡

int currentFragment = 0; 

    public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState != null) { 
     currentFragment = savedInstanceState.getInt(CURRENT_FRAGMENT_KEY, 0); 
     switchContent(currentFragment); 
    } else { 
      // change fragment by index 
     switchContent(0); 
    } 
} 

    @Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putInt(CURRENT_FRAGMENT_KEY, currentFragment); 
    Log.d("onSaveInstanceState" ," current fragment" + currentFragment); 
    super.onSaveInstanceState(outState); 
} 

manifest

<activity 
     android:name="com.appiphany.auskills.activity.SplashActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".activity.MainActivity" 
     android:screenOrientation="portrait" />  

一切都很好,當我建立我的應用程序的調試鍵:按Home鍵,然後再返回到應用程序,打開它之前的片段。但是,當我建立在釋放模式(使用我的私鑰,我不使用proguard)時,請在MainActivity中按HOME按鈕,然後再次打開應用程序,它從SplashActivity開始。我不知道這個奇怪的問題。我的事件嘗試這一個,但它並沒有幫助:

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    currentFragment = savedInstanceState.getInt(CURRENT_FRAGMENT_KEY, 0); 
     switchContent(currentFragment);  
} 

有什麼想法嗎?

更新:我發現了另一個奇怪的問題:這個問題只發生在我從apk文件安裝它時發生。安裝後,手機會詢問2個選項:DoneOpen。如果我按open,則會發生此問題。當我通過任務管理器終止應用程序時,再次打開,它可以正常工作。

+0

您看見這長期存在的令人討厭的Android bug: http://stackoverflow.com/a/16447508/769265 –

回答

2

當從Splash導航到Main活動時,通過使用FLAG_ACTIVITY_NEW_TASK修復了問題。我只是想知道爲什麼它可以在調試模式下工作(從apk安裝版本再次安裝)。這是我對任何人都可行的代碼有同樣的問題:

Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
finish(); 
startActivity(intent); 

更新:非常感謝David Wasser,所以正確答案應該是這樣的:

// SplashActivity 
if(!isTaskRoot()) { 
    finish(); 
    return; 
} 

參考:Re-launch of Activity on Home button, but...only the first time

+0

此修復程序可能會導致您其他問題。看到我的評論,並閱讀關於這個Android框架的錯誤。 –

+0

感謝您的提及。我試過你的方式,它的工作。但我誤解了一下。我只是想知道這種方式有什麼問題嗎?因爲我看到它檢查是否不是任務根,然後完成我的活動。例如,我的應用程序從安裝程序 - > Splash運行,當Splash不是任務根目錄時,它會完成,然後它會從Splash創建新任務? – R4j

+0

如果你的啓動畫面不是根活動,那麼它將完成()。這將使用戶進入啓動屏幕下方的活動(這是之前啓動的應用程序中的活動)。它不會創建新的任務。問題是,如果已經有一個包含應用程序的任務,並且您從主屏幕啓動它,則Android會創建另一個啓動屏幕活動實例,並將其放在現有任務之上。這不是你想要的。你想要的是它只是把現有的任務推進,這是這種解決方法所做的。 –