Tan*_*dal 345 java android flow screen android-activity
我的应用程序有以下流程屏幕:
Home->screen 1->screen 2->screen 3->screen 4->screen 5
现在我log out
在每个屏幕上都有一个公共按钮
(Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5
)
我希望当用户点击退出按钮(从任何屏幕)时,所有屏幕都将完成,并且Log in
将打开一个新屏幕.
我几乎尝试过所有FLAG_ACTIVITY
这一切.我还在stackoverflow中查看了一些答案,但无法解决问题.我的应用程序是在Android 1.6上,因此无法使用FLAG_ACTIVITY_CLEAR_TASK
有什么方法可以解决这个问题吗?
DAr*_*rkO 513
使用:
Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这将清除所有家庭活动.
假设您在用户登录并创建主页时完成登录屏幕,之后所有屏幕都在1到5之间.我发布的代码将返回主屏幕完成所有其他活动.您可以在意图中添加额外内容并在主屏幕活动中读取并完成它(也许可以从那里再次启动登录屏幕或其他内容).
我不确定,但您也可以尝试使用此标志登录.我不知道在这种情况下如何订购活动.因此,不知道它是否会清除您所在的屏幕下面的那些,包括您当前所在的屏幕,但它绝对是要走的路.
希望这可以帮助.
Kon*_*Ken 296
你可以试试Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK
.它将完全清除所有先前的活动并开始新的活动.
Hen*_*que 127
在启动新Activity之前,只需添加以下代码:
finishAffinity();
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望它在以前版本的Android中运行:
ActivityCompat.finishAffinity(this);
Run Code Online (Sandbox Code Playgroud)
Eri*_*ski 39
当用户希望退出所有打开的活动时,他们应该按下一个按钮,该按钮加载应用程序启动时运行的第一个活动,清除所有其他活动,然后完成最后剩余的活动.当用户按下退出按钮时,运行以下代码.就我而言,LoginActivity
是我的程序中第一个运行的活动.
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
上面的代码清除除了之外的所有活动LoginActivity
.然后将以下代码放入LoginActivity
s中onCreate(...)
,以监听何时LoginActivity
重新创建并传递'EXIT'信号:
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
Run Code Online (Sandbox Code Playgroud)
为什么Android中的退出按钮太难了?
Android会努力阻止您在应用程序中使用"退出"按钮,因为他们希望用户从不关心他们使用的程序是否在后台运行.
Android操作系统开发人员希望您的程序能够在意外关闭和关闭手机电源后继续运行,当用户重新启动程序时,他们会在他们中断的地方继续运行.因此,用户可以在使用您的应用程序时接听电话,并打开地图,这需要释放您的应用程序以获取更多资源.
当用户恢复您的应用程序时,他们会立即从中断处继续操作而不会中断.此退出按钮正在从活动管理器中篡夺权力,可能导致自动管理的Android程序生命周期出现问题.
Gem*_*Gem 31
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这适用于所有Android版本.其中IntentCompat
的类支持Android库添加.
Ari*_*ael 30
使用以下内容进行活动
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
Run Code Online (Sandbox Code Playgroud)
删除CLEAR_TASK标志以供片段使用.
我希望这可能会对一些人有用.
小智 21
Run Code Online (Sandbox Code Playgroud)public void finishAffinity ()
在API级别16中添加
完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动.这通常在应用程序可以启动到另一个任务时使用(例如从它理解的内容类型的ACTION_VIEW),并且用户已经使用向上导航切换出当前任务并进入其自己的任务.在这种情况下,如果用户已导航到第二个应用程序的任何其他活动,则应将所有这些活动作为任务切换的一部分从原始任务中删除.
请注意,此完成不允许您将结果传递给上一个活动,如果您尝试这样做,则会抛出异常.
Aks*_*aru 19
我想我迟到了,但答案很简单.Activity中有一个finishAffinity()方法,它将完成当前活动和所有父活动,但它仅适用于Android 4.1或更高版本.
对于API 16+,请使用
finishAffinity();
对于16岁以下,请使用
ActivityCompat.finishAffinity(YourActivity.this);
希望能帮助到你!
Joh*_*ohn 16
在旁注,很高兴知道
这个答案有效(/sf/answers/942807981/)
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
Run Code Online (Sandbox Code Playgroud)
而这不起作用
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
.setFlags()
替换任何以前的标志,并且不会附加任何新标志.addFlags()
.
所以这也会奏效
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
Jay*_*hit 13
如果你的应用程序有最低sdk版本16,那么你可以使用finishAffinity()
完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动.
这对我有用.在Top Top屏幕中删除所有后栈活动,
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
Run Code Online (Sandbox Code Playgroud)
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
And*_*ndy 10
我为此实现了一个解决方案(我想我在Stack Overflow的某个地方找到了它,但我不记得了,所以感谢无论谁做到了这一点):
从您的任何活动中执行此操作:
// Clear your session, remove preferences, etc.
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
然后在您的LoginActivity中,覆盖onKeyDown:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)
Amr*_*rit 10
对于应用程序最后一个屏幕上的注销按钮,在注销按钮监听器上使用此代码完成所有打开的先前活动,您的问题就解决了.
{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
我有同样的问题你可以使用IntentCompat
,像这样:
import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
Run Code Online (Sandbox Code Playgroud)
这段代码对我有用.
Android api 17
小智 8
Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();
Run Code Online (Sandbox Code Playgroud)
小智 7
就我而言,我finishAffinity()
在上一个活动中使用了功能,例如:
finishAffinity()
startHomeActivity()
Run Code Online (Sandbox Code Playgroud)
希望它会有用。
登录 - >主页 - >屏幕1->屏幕2->屏幕3->屏幕4->屏幕5
在屏幕4(或任何其他) - >
StartActivity(Log in)同
FLAG_ACTIVITY_CLEAR_TOP
对于API> = 15到API 23的简单解决方案.
Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(nextScreen);
ActivityCompat.finishAffinity(currentActivity.this);
Run Code Online (Sandbox Code Playgroud)
如果您startActivityForResult()
在以前的活动中使用,只需覆盖OnActivityResult()
并finish();
在所有活动中调用其中的方法..这将完成工作......