为什么重启后会创建两个活动实例?

时间:2014-07-07 09:47:10

标签: android android-activity

我有一个启动接收器,它接收BOOT_COMPLETED事件并为我的应用程序启动默认活动,如下所示:

if(MyApplication.GetCurrentActivity()==null)
{
    Intent mActivityIntent = new Intent(context, LauncherActivity.class);
    mActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(mActivityIntent);
}

启动后我正在设置活动。如果没有启动任何活动或上次启动的活动,GetCurrentActivity()将返回null。 到目前为止没有问题。

但是如果用户在启动LauncherActivity之前触摸了应用程序图标,则会创建两个相同活动的实例,因为它们处于两个不同的任务中(我猜)。如何防止这种情况并仅启动一个活动实例。

2 个答案:

答案 0 :(得分:1)

尝试 -

if(MyApplication.GetCurrentActivity()==null)
{
  Intent mActivityIntent = new Intent(context, LauncherActivity.class);

  mActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
  Intent.FLAG_ACTIVITY_NEW_TASK);

  mActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

  startActivity(mActivityIntent);

  finish();
}

<强>更新

然后您可以使用 FLAG_ACTIVITY_REORDER_TO_FRONT -

如果已启动的活动已经运行,则该标志将使已启动的活动被带到其任务的历史堆栈的前面.-

if(MyApplication.GetCurrentActivity()==null)
    {
      Intent mActivityIntent = new Intent(context, LauncherActivity.class);

      mActivityIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)

      startActivity(mActivityIntent);

      finish();
    }

例如 -

  

考虑一项由四项活动组成的任务:A, B, C, D。如果D   使用解析为组件的Intent调用startActivity()   活动B,然后B将被带到历史的前面   使用此结果顺序堆栈:A, C, D, B

答案 1 :(得分:0)

您可以使用:

 <activity
        android:name="name"
        android:label="label"
        android:launchMode="singleTop">
 </activity>

此活动只启动一个活动实例。现在,您可以实现onNewIntent()。

希望它可以帮助你:)