清除整个历史记录堆栈,并在Android上开始新的活动
-
28-09-2019 - |
题
是否可以在堆栈上开始一项活动,清除整个历史记录?
情况
我有一个活动堆栈,可以使用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。