是否可以在堆栈上开始一项活动,清除整个历史记录?

情况

我有一个活动堆栈,可以使用A-> B-> C或B-> C(屏幕A选择用户令牌,但许多用户只有一个令牌)。

在屏幕C中用户 可能 采取行动,使屏幕B无效,因此该应用程序希望将它们带到屏幕A,而不管它是否已经在堆栈中。屏幕A应该是我应用程序中堆栈中唯一的项目。

笔记

还有许多其他类似的问题,但是我还没有找到任何回答这个确切问题的东西。我尝试打电话 getParent().finish() - 这始终导致无效指针异常。 FLAG_ACTIVITY_CLEAR_TOP 仅当活动已经在堆栈上时起作用。

有帮助吗?

解决方案

在API级别11中,仅为此添加了一个新的意图标志: intent.flag_activity_clear_task

只是为了澄清,请使用以下方式:

爪哇

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);


科特林

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK


不幸的是,对于API LVL <= 10,我还没有找到清洁的解决方案。这 “ Donthackandroidlikethis”解决方案 确实是纯粹的黑客。你不应该那样做。 :)

编辑:按照 @本·皮尔森评论,对于API <= 10,现在可以使用 IntentCompat 上课。一个人可以使用 IntentCompat.FLAG_ACTIVITY_CLEAR_TASK 标志以清除任务。因此,您也可以支持API级别11。

其他提示

案例1:只有两个活动A和B:

这里的活动流量为a-> b .on单击B中的backutton,我们需要关闭应用程序,然后在从just call ainter()开始活动b开始时()这将防止Android存储Active a in to BackStack.eg进行活动A IS应用程序的Loding/Splash屏幕。

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

案例2:超过两个活动:

如果有诸如a-> b-> c-> d-> b之类的流程,并且在活动b中单击“活动”中的返回按钮时。在这种情况下,我们应该使用。

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

这里的活动b将是从背面而不是新实例开始的。flag_activity_clear_topand Intent.flag_activity_new_task清除了堆栈并将其作为顶部。

使用Android的较新版本> = API 16使用 finishAffinity()

方法适合> = API 16。

Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
  • 它与启动新活动相同,并清除所有堆栈。
  • 或重新启动主动脉/第一活性。

我也花了几个小时……并同意flag_activity_clear_top听起来像您想要的:清除整个堆栈,除了启动的活动,因此后面按钮退出了应用程序。然而,正如迈克(Mike)重新提到的那样,flag_activitivitivity_clear_top仅在要启动的活动已经在堆栈中时才能起作用。当活动不存在时,国旗无需做任何事情。

该怎么办?将正在使用flag_activity_new_task在堆栈中启动的活动放置,这使该活动成为历史记录堆栈中新任务的开始。然后添加flag_activity_clear_top标志。

现在,当flag_activity_clear_top进入堆栈中的新活动时,它将在那里并在清除其他所有内容之前被拉起。

这是我的注销功能;视图参数是该函数随附的按钮。

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

您不应该更改堆栈。 Android Back按钮应像Web浏览器中一样工作。

我可以想到一种方法,但这是一个黑客。

  • 进行活动 singleTask 通过将其添加到 AndroidManifest例子:

    <activity android:name=".activities.A"
              android:label="@string/A_title"
              android:launchMode="singleTask"/>
    
    <activity android:name=".activities.B"
              android:label="@string/B_title"
              android:launchMode="singleTask"/>
    
  • 延长 Application 它将拥有去哪里的逻辑。

例子:

public class DontHackAndroidLikeThis extends Application {

  private Stack<Activity> classes = new Stack<Activity>();

  public Activity getBackActivity() {
    return classes.pop();
  }

  public void addBackActivity(Activity activity) {
    classes.push(activity);
  }
}

从A到B:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class); 
startActivity(this, B.class);

从B到C:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class); 
startActivity(this, C.class);

在C中:

If ( shouldNotGoBackToB() ) {
  DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
  app.pop();
}

并处理后按钮 pop() 从堆栈。

再一次,您不应该这样做:)

开始新活动后,立即使用 startActivity, ,确保您打电话 finish() 因此,当前活动不会堆叠在新的活动后面。

试试这个:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

尝试以下代码,

Intent intent = new Intent(ManageProfileActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK| 
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

为了我 没有任何 上述方法 不行。

只是这样做 清除所有以前的活动:

finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)

我发现太简单hack只需在此添加新元素 AndroidManifest 作为:-

<activity android:name=".activityName"
          android:label="@string/app_name"
          android:noHistory="true"/>

android:noHistory 将从堆栈中清除您不必要的活动。

有时,您的Android模拟器可能无法连接Eclipse DDMS工具,并要求ADB手动启动。在这种情况下,您可以使用命令提示符开始或停止ADB。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top