我的应用程序有以下流程屏幕:
主屏->屏1->屏2->屏3->屏4->屏5
现在我在每个屏幕上都有一个公共注销按钮
(主屏/ 1屏/ 2屏/ 3屏/ 4屏/ 5屏)
我想当用户点击注销按钮(从任何屏幕),所有屏幕将完成,一个新的屏幕登录将打开。
我已经尝试了几乎所有的FLAG_ACTIVITY来实现这一点。
我还通过一些答案在stackoverflow,但不能解决这个问题。
我的应用程序是在Android 1.6上,所以不能使用FLAG_ACTIVITY_CLEAR_TASK
有什么办法解决这个问题吗?
我为此实现了一个解决方案(我想我在Stack Overflow的某个地方找到了它,但我不记得了,所以感谢在第一个地方做这件事的人):
在你的任何活动中都这样做:
// Clear your session, remove preferences, etc.
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
然后在你的LoginActivity,覆盖onKeyDown:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
return true;
}
return super.onKeyDown(keyCode, event);
}
当用户希望退出所有打开的活动时,他们应该按下一个按钮,加载应用程序启动时运行的第一个活动,清除所有其他活动,然后让最后一个活动完成。当用户按下退出按钮时,运行以下代码。在我的例子中,LoginActivity是程序中运行的第一个活动。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上面的代码清除除LoginActivity之外的所有活动。然后将以下代码放入LoginActivity的onCreate(…)中,用于监听LoginActivity何时被重新创建并传递'EXIT'信号:
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
为什么在Android中创建退出按钮如此困难?
Android试图阻止你在应用程序中设置“退出”按钮,因为他们希望用户永远不会关心他们所使用的程序是否在后台运行。
Android操作系统开发人员希望你的程序能够在意外关机和关机的情况下存活下来,当用户重新启动程序时,他们会从停止的地方继续运行。因此,用户可以在使用应用程序时接到电话,并打开地图,这需要释放应用程序以获得更多资源。
当用户重新开始您的应用程序时,他们会在没有中断的情况下立即开始。这个退出按钮篡夺了活动管理器的权力,可能会导致自动管理的android程序生命周期出现问题。
从developer.android.com:
public void finishAffinity ()
在API级别16中添加
Finish this activity as well as all activities immediately below it in the current task that have the same affinity. This is typically used when an application can be launched on to another task (such as from an ACTION_VIEW of a content type it understands) and the user has used the up navigation to switch out of the current task and in to its own task. In this case, if the user has navigated down into any other activities of the second application, all of those should be removed from the original task as part of the task switch.
请注意,此结束不允许您向前一个活动交付结果,如果您试图这样做,则会抛出异常。
如果你的应用程序拥有最低sdk版本16,那么你可以使用finishAffinity()
完成此活动以及当前任务中紧接在其下面的具有相同关联的所有活动。
这是我的工作在顶部支付屏幕删除所有后台活动,
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
顺便说一句,很高兴知道
这个答案有效(https://stackoverflow.com/a/13468685/7034327)
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
this.finish();
然而这行不通
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
. 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);
我试了我这边的旗子,还是没用。我有一个设计非常相似的应用程序,我有一个可能的解决方案在逻辑方面。我已经使用共享首选项构建了登录和注销。
如果我登出,数据在我的共享首选项被销毁/删除。
从我的任何活动(如Home.java)中,我检查共享首选项是否有数据,在这种情况下,它不会有数据,因为我从其中一个屏幕注销时销毁了它。因此,逻辑破坏/完成该活动,并将我带回Login活动。您可以在所有其他活动中复制此逻辑。
但是,请记住在onPostResume()中执行这个检查,因为这是当你返回Home.java时调用的
代码示例如下:
@Override
protected void onPostResume() {
SharedPreferences pref = this.getSharedPreferences("user_details", Context.MODE_PRIVATE);
if (pref.getAll().isEmpty()){
//Shared Preferences has no data.
//The data has been deleted
Intent intent = new Intent(getApplicationContext(), Login.class);
startActivity(intent);
finish();
//Finish destroys that activity which in our case is the Home.java
}
super.onPostResume();
}