Android:如何确定某个活动是否已在运行?

问题描述:

我创建了一个具有菜单的基本活动,该菜单将在应用程序中打开其他活动。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

有一个简单的解决方案。要禁用当前活动的菜单项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

我觉得你不必做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

的种类简单的解决方案 - 为什么不在您的baseActivity中有一个全局int,称为“int choice”?当您切换到某个活动时,只需将该选项设置为该活动即可。例如

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

您可以通过两种方式来实现这一点:

  1. 从活动的呼叫活性的,具有标志称呼其为FLAG_ACTIVITY_REORDER_TO_FRONT,所以将会再次调用,而无需创建一个新的实例,所以回去不会产生任何问题。

  2. 如上所述,如果活动A在前面,请禁用活动A的菜单项。