2013-12-20 105 views
1

我的主要活動是不斷接收客戶端的數據。它有三個菜單項,分別是About,Settings和Home。這三個菜單選項卡在所有三個屏幕即主屏幕(MainActivity類),關於頁面和設置頁面都可見。 在首頁菜單項的點擊,我已經寫了下面的代碼返回主菜單項目點擊

case R.id.menu_Home: 
     Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 

我的問題是,如果我在任何屏幕單擊主菜單項,我會重新啓動我的活動?如果是,那麼請提供一些關於如何進入主要活動屏幕的指導,而無需重新啓動它,因爲我不能通過一次又一次重新啓動活動來損失數據。

+0

「設置」和「關於」也是活動嗎? –

回答

1

您不應該將Activity作爲數據源進行中繼,因爲它可以在任何時候被操作系統終止。您可以使用SharedPreferencesLiteSQL或其他任何方式保存活動狀態,並使用onResume方法中的這些數據重新創建活動狀態。

+0

你能提供一些代碼片段嗎? – Ravneet

0

檢查當前活動是您的mainActivity然後開始意圖。

case R.id.menu_Home: 
if(!(this.getClass().getSimpleName()==MainActivity)){ 
Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 
} 
1

什麼你在MainActivity做不談,你可以這樣做:

Intent intent = new Intent(this, AboutPage.class); 
startActivityForResult(intent, 10); 

Intent intent = new Intent(this, SettingsPage.class); 
startActivityForResult(intent, 20); 

  1. 在MainActivity,與啓動其它活動

  2. 在這兩個所謂的活動,這樣做:

    case R.id.menu_Home: 
        setResult(SOME_NUMBER_FROM_ABOUT); 
        finish(); 
    

    case R.id.menu_Home: 
        setResult(SOME_NUMBER_FROM_SETTINGS); 
        finish(); 
    

    ,將帶你回到MainActivity。

  3. 覆蓋onActivityResult()在您的MainActivity:

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        super.onActivityResult(requestCode, resultCode, data); 
    
        switch(requestCode) { 
         case 10: 
          //handle returning from About page 
          //you can also check for resultCode 
          //if (resultCode == SOME_NUMBER_FROM_ABOUT) { 
          // some code here 
          //} 
          break; 
    
         case 20: 
          //handle returning from Settings page 
          break;  
        } 
    

只要記住調整這個你的類名和SOME_NUMBER_FROM_ABOUT是一個int,你可以選擇任何你希望它是。

1

是的,您正在重新啓動並創建主要活動的新實例。 這可能會有所幫助: http://developer.android.com/training/basics/activity-lifecycle/index.html

在主要活動中,你不在家時,選擇從菜單中選擇爲主要活動已加載並運行需要做任何事情。您當前的代碼將創建並啓動一個新的活動實例。

//in MainActivity 
case R.id.menu_Home: 
    break; 

您還應該考慮從您主要活動的菜單中刪除家庭選項,因爲它的一種無用功能。這可以通過創建不同的菜單來實現,而不需要主選項,並且如果來自主活動則充氣。

在所有其他活動中,您現有的代碼應該可以正常工作。但是,如果您在加載任何新活動(除了在主活動中)之前使用完成()每個活動,那麼活動堆棧將僅由主活動和當前正在運行的活動組成。在這種情況下,您可以使用以下代碼從任何其他活動返回到主要活動。這樣,您仍然可以重新啓動主要活動,但可能不必重新創建它。

//In other activities  
case R.id.menu_Home: 
    finish(); 
0

嘗試是這樣的:

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_Home: 
     if (!(this instanceof MainActivity)) { 
      finish(); 
     } 

     break; 
    case R.id.settings: 
     if (!(this instanceof Settings)) { 
      if(!(this instanceof MainActivity)) 
          finish(); 
       Intent intent = new Intent(this, Settings.class); 
      startActivity(intent); 
     } 

     break; 

    default: 
     break; 
    } 

流程將是:

If 

你在MainActivity和mainActivity選擇什麼都不做

else 

只是完成什麼活動你真的很開心。

If 

你在設置活動和設置中選擇什麼都不做

else if 

你是在主要活動和剛開始設置活動

else 

光潔度無論你身在何處,並開始設置。

Do same with others 

該流程將確保您只有在主要活動時纔會再次創建它。 你去下一個活動,當你回到你完成那個活動。