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中禁用菜单项吗?
感谢您的输入。对不起,如果这似乎是一个微不足道的问题。
有一个简单的解决方案。要禁用当前活动的菜单项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;
}
这对禁用菜单项很有用,但它不能完成以前的活动,所以后退按钮具有所有活动的历史记录。 – 2012-08-06 20:47:36
android:noHistory =“true”是我添加到我的清单中的一个
当然。如果那是你想要的行为。很高兴你能解决这个问题。 – 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>
^-^
这工作完美。但是,由于我的基本活动打开了第一个意图,我怎样才能防止后退按钮关闭该意图并返回空基本活动?当没有其他活动开放时,预期行为将退出程序,而不是进入空白基本活动。 – 2012-08-02 05:58:43
我认为这工作,我插入这个在我的onCreate()的底部(012)。 } – 2012-08-02 06:42:33
这个解决方案太可怕了。你将最终完成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;
您可以通过两种方式来实现这一点:
从活动的呼叫活性的,具有标志称呼其为
FLAG_ACTIVITY_REORDER_TO_FRONT
,所以将会再次调用,而无需创建一个新的实例,所以回去不会产生任何问题。如上所述,如果活动A在前面,请禁用活动A的菜单项。
你选择的答案“最佳”将让你进入了很多麻烦(恕我直言)看到我对这个答案的评论,请看看我的答案。 – 2012-08-02 14:52:11