【问题标题】:Android: How to determine if an activity is already running?Android:如何确定一个活动是否已经在运行?
【发布时间】:2012-08-02 05:34:20
【问题描述】:

我创建了一个有菜单的基础活动,这个菜单将打开应用程序中的其他活动。

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 次相同的活动。

如何判断 Activity 是否已在运行,因此用户无法继续打开相同的 Activity?

或者更确切地说,你会建议我在活动 A 中禁用一次菜单项吗?

感谢您的意见。抱歉,这似乎是一个微不足道的问题。

【问题讨论】:

  • 您选择的“最佳”答案会给您带来很多麻烦(恕我直言)。请参阅我对该答案的评论,并请查看我的答案。

标签: android android-intent android-activity


【解决方案1】:

有一个简单的解决方案。您想在BaseActivity 中禁用onPrepareOptionsMenu() 中当前活动的菜单项,如下所示:

@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;
}

【讨论】:

  • 这对于禁用菜单项很有用,但它不会完成上一个活动,因此后退按钮具有所有活动的历史记录。
  • android:noHistory="true" 是我在清单中添加到 的内容,因此后退按钮不会遍历我之前单击的每个活动
  • 当然。如果这是你想要的行为。很高兴您能够解决问题。
【解决方案2】:

我认为你不需要这样做。我认为你只需在 AndroidManifest.xml 中指定活动的 launchMode="singleTask".Code:

<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> 

^-^

【讨论】:

  • 这很完美。但是,由于我的基本活动打开了第一个意图,我如何防止后退按钮关闭该意图并返回到空的基本活动?当没有其他活动打开而不是转到空白的基本活动时,预期的行为将退出程序。
  • 我认为这行得通,我将它插入到 onCreate() 的底部..... if (isTaskRoot() ) { finish(); }
  • 这个解决方案太可怕了。您最终将拥有 3 个独立的任务,其中包含 3 个独立的活动。每个都有相同的图标和相同的名称。您将无法在“最近的应用程序列表”中区分它们(长按 HOME)。此外,如果您正在进行一项活动并且用户按下 HOME 按钮,他将无法正常返回活动。请不要使用不同的启动模式来解决这个问题。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    您可以通过两种方式实现:

    1. 要从activity A调用activity A,调用时flag为FLAG_ACTIVITY_REORDER_TO_FRONT,这样会在不创建新实例的情况下再次调用A,所以返回不会有任何问题。

      李>
    2. 如您所说,如果活动 A 在前面,则禁用活动 A 的菜单项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多