我正在使用Android 2.2。我有一个应用程序在一段时间不活动后注销(导致应用程序返回登录页面)。我在Intent.FLAG_ACTIVITY_CLEAR_TOP
使用Intent
。但是,我注意到当我的应用程序在后台并且在一段时间内处于非活动状态时,登录页面会突然弹出,我的应用程序会转到前台。我期待登录页面将保留为后台。当我没有使用任何标志作为我的意图时,这不会发生。如果我没有为我的Intent使用任何标志,则会在后台安静地启动登录页面。但是,如果不使用Intent.FLAG_ACTIVITY_CLEAR_TOP
,我将无法清除历史记录堆栈。
为什么会这样?如何安静地在背景上发起活动?
以下是我的代码片段:
@Override //Inside a class extending AsyncTask
protected void onPostExecute(String result)
{
((GlobalApplication)getApplicationContext()).setIsLogin(false); //user is not logged in anymore
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
下面是我从Lars建议的代码片段:
@Override //Inside a class extending AsyncTask
protected void onPostExecute(String result)
{
((GlobalApplication)getApplicationContext()).setIsLogin(false); //user is not logged in anymore
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if(((GlobalApplication)getApplicationContext()).isOnBackground())
((GlobalApplication)getApplicationContext()).setPendingIntent(intent);
else
startActivity(intent);
}
@Override //overrides android.app.Activity. inside the current Activity
protected void onResume()
{
super.onResume();
Intent pendingIntent = ((GlobalApplication)getApplicationContext()).getPendingIntent();
if(pendingIntent != null)
startActivity(pendingIntent);
}
答案 0 :(得分:1)
您是否尝试检查您是否仍然在活动的onResume部分登录,而不是在计时器关闭时调用LoginActivity(这是我假设您正在做的事情)?
编辑:为了便于说明,您将在预定义的一段时间后(或发生事件时)将用户注销。此时,您启动一个AsyncTask,它为您的loginActivity创建一个intent,为它添加一个标志并启动它。而且你的问题是你不希望loginActivity到达前台,除非用户打开了应用程序。那是准确的吗?
因为如果是这样,我建议使用像上面提到的onResume方法。只要活动到达(返回)前景,就会调用它们。为了显示登录屏幕,即使用户没有更改活动,您也可以尝试发送广播并在活动中收听广播。
编辑:我的评论中的代码段(现在格式正确):
@Override
protected void onResume() {
super.onResume();
if (!getLoggedIn())
{
startActivity(new Intent(this, LoginActivity.class));
finish();
}
}