2012-08-02 56 views
3

我創建了一個具有菜單的基本活動,該菜單將在應用程序中打開其他活動。Android:如何確定某個活動是否已在運行?

public class BaseActivity extends Activity{ 

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    //Intent i = new Intent("com.app.Activity1"); 
    //startActivity(i); 

    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.icon:  Intent i1 = new Intent("com.app.Activity1"); 
          startActivity(i1); 
          break; 
     case R.id.text:  Intent i2 = new Intent("com.app.Activity2"); 
          startActivity(i2); 
          break; 
     case R.id.icontext: Intent i3 = new Intent("com.app.Activity3"); 
          startActivity(i2);        
          break; 
    } 
    return true; 
} 
} 

所有活動擴展此基礎活動,所以當你按下菜單按鈕,在彈出菜單,您可以選擇的活動。

然而,讓我們說我使用菜單去活動A.一旦我在活動A中,我可以使用菜單再次去活動A.我可以做X次,但現在後退按鈕將返回到同一活動X次。

如何判斷活動是否已在運行,以便用戶無法繼續打開相同的活動?

或者說,你會建議我在活動A中禁用菜單項嗎?

感謝您的輸入。對不起,如果這似乎是一個微不足道的問題。

+0

你選擇的答案「最佳」將讓你進入了很多麻煩(恕我直言)看到我對這個答案的評論,請看看我的答案。 – 2012-08-02 14:52:11

回答

2

有一個簡單的解決方案。要禁用當前活動的菜單項onPrepareOptionsMenu()BaseActivity這樣的:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // Determine what activity I am and find the menu item for that activity 
    MenuItem menuItem = null; 
    if (getClass().equals(com.app.Activity1.class)) { 
     menuItem = menu.findItem(R.id.icon); 
    } else if (getClass().equals(com.app.Activity2.class)) { 
     menuItem = menu.findItem(R.id.text); 
    } else if (getClass().equals(com.app.Activity3.class)) { 
     menuItem = menu.findItem(R.id.icontext); 
    } 
    // Disable this menu item 
    if (menuItem != null) { 
     menuItem.setEnabled(false); // Make it non-selectable (even with shortcut) 
     menuItem.setVisible(false); // Make it non-visible 
    } 
    return true; 
} 
+0

這對禁用菜單項很有用,但它不能完成以前的活動,所以後退按鈕具有所有活動的歷史記錄。 – 2012-08-06 20:47:36

+0

android:noHistory =「true」是我添加到我的清單中的一個,所以後退按鈕不會通過我之前單擊的每個活動 – 2012-08-06 21:02:02

+0

當然。如果那是你想要的行爲。很高興你能解決這個問題。 – 2012-08-06 21:21:48

2

我覺得你不必做that.I認爲你指定你的活動的launchMode = 「singleTask」。代碼在你的AndroidManifest.xml:

<activity android:name=".com.app.Activity1" android:launchMode="singleTask" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait"></activity> 
<activity android:name=".com.app.Activity2" android:launchMode="singleTask" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait"></activity> 
<activity android:name=".com.app.Activity3" android:launchMode="singleTask" android:configChanges="orientation|keyboardHidden" android:screenOrientation="portrait"></activity> 

^-^

+0

這工作完美。但是,由於我的基本活動打開了第一個意圖,我怎樣才能防止後退按鈕關閉該意圖並返回空基本活動?當沒有其他活動開放時,預期行爲將退出程序,而不是進入空白基本活動。 – 2012-08-02 05:58:43

+0

我認爲這工作,我插入這個在我的onCreate()的底部(012)。 } – 2012-08-02 06:42:33

+0

這個解決方案太可怕了。你將最終完成3項獨立的任務,並在其中進行3項獨立的活動。每個人都有相同的圖標和相同的名稱。您將無法在「最近的應用程序列表」中將其分開(長按HOME)。另外,如果您正在進行其中一項活動,並且用戶按下HOME按鈕,他將無法正常返回活動。請**不要**使用不同的launchModes來解決這個問題。 – 2012-08-02 14:50:51

0

的種類簡單的解決方案 - 爲什麼不在您的baseActivity中有一個全局int,稱爲「int choice」?當您切換到某個活動時,只需將該選項設置爲該活動即可。例如

case R.id.icon: 
    if (choice != 1){ 
     startActivity(i1); 
     choice = 1; 
    } 
    break; 
0

您可以通過兩種方式來實現這一點:

  1. 從活動的呼叫活性的,具有標誌稱呼其爲FLAG_ACTIVITY_REORDER_TO_FRONT,所以將會再次調用,而無需創建一個新的實例,所以回去不會產生任何問題。

  2. 如上所述,如果活動A在前面,請禁用活動A的菜單項。

相關問題