问题与FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_CLEAR_TOP- Android

时间:2012-07-03 13:09:32

标签: android android-layout android-intent

我的设备中安装了一个应用程序。我正尝试使用以下代码从另一个应用程序B的按钮启动此应用程序A:

Button buttonStart = (Button)findViewById(R.id.buttonStart);
    buttonStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            intent.setClassName("co.abc.android.test",
                    "co.abc.android.test.Abc");
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);

        }
    });

以下是我的问题:

  • 我启动了应用程序A

  • 我按下主页按钮

  • 从应用程序B的按钮点击,我再次启动应用程序A

  • 按返回按钮退出现已启动的应用程序A. 来自app B
  • 虽然我按下返回按钮退出应用程序A,但我再次被带到应用程序A的主要活动,我最初已经启动了。

在提到这个问题时,我已经在许多地方读到使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 来解决这个问题。但是,因为我从一个我无法访问其上下文的地方调用app A的意图,它会给我以下错误。

01-01 00:09:54.694: ERROR/AndroidRuntime(283): *** FATAL EXCEPTION IN SYSTEM PROCESS: WindowManagerPolicy
    android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
    at android.app.ContextImpl.startActivity(ContextImpl.java:884)
    at com.android.internal.policy.impl.LockScreen$DialerMethods.onTrigger(LockScreen.java:218)
    at com.android.internal.widget.multiwaveview.Dialer$2.run(Dialer.java:366)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at com.android.server.wm.WindowManagerService$PolicyThread.run(WindowManagerService.java:752)

如何解决此问题,以便当我按下返回按钮时,我再次看不到相同的活动(如果之前已启动)?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试在onClick方法内添加:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

答案 1 :(得分:0)

启动另一个应用程序的最佳方式是:

Intent intent = new Intent();
intent.setClassName("co.abc.android.test", "co.abc.android.test.Abc");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);

这模拟了当用户从可用应用列表中选择应用时Android的功能。

假设“co.abc.android.test.Abc”是该应用程序的根活动(即:具有intent-filter ACTION_MAIN/CATEGORY_LAUNCHER的那个),这将启动应用程序(如果不是已经运行)或者只是将应用程序从后台运行到前台(如果它已在运行)。