我的应用中具有“注销”按钮和用户的所有活动都可以从任何活动中注销。我想将用户发送到登录活动而不显示以前的活动。为此我正在使用:
以下是注销方法删除会话
public void logoutUser() {
//clearing all data from sharedPreferences
editor.clear();
editor.commit();
Intent intnt = new Intent(contxt, LoginActivity.class);
// Closing all the Activities
intnt.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// Add new Flag to start new Activity
intnt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
// Staring Login Activity
contxt.startActivity(intnt);
}
当用户点击注销按钮然后按Logout方法调用时,从第二个活动。我的第二个活动类扩展了SherlockFragmentActivity。
public void Logout(MenuItem v) {
sessionMngr.logoutUser();
}
当我按下退出按钮时,我进入登录界面,但是当我按下设备上的后退按钮时,它显示以前的活动 - 当我在登录屏幕中按下后退按钮时,我应该转到Android主屏幕。
我在stackoverflow上看到了一些问题,但没有实现我的目标。有人说我在清单文件中使用android:noHistory =“true”,但是当我在第三个活动中并按回按钮时它会显示android主屏幕,但它应该转到第二个活动。我也试过了FLAG_ACTIVITY_NO_HISTORY,但这也没有实现我的目标。
我不明白我错在哪里。请有人解决。
提前致谢
答案 0 :(得分:13)
尝试同时指定以下两项:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
同样为安全起见,请在开始此活动后调用finish()。
答案 1 :(得分:8)
最好的方法是在注销时在应用程序中使用LocalBrodCastManager。
当用户按下注销按钮时,您可以使用以下代码发送本地广播。
@Override
public void onclick(View view){
//do this on logout button click
final String LOG_OUT = "event_logout";
Intent intent = new Intent(LOG_OUT);
//send the broadcast to all activities who are listening
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
现在所有的活动都应该听这个广播。活动看起来像
@Override
protected void onCreate(Bundle savedInstanceState) {
// Register mMessageReceiver to receive messages.
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter(LOG_OUT));
}
// handler for received Intents for logout event
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//do your code snippet here.
finish();
}
};
@Override
protected void onDestroy() {
// Unregister since the activity is not visible
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
注意:如果您有多个活动,则建议从基本活动扩展所有活动,并仅在基本活动中实施此本地广播管理器。因此,您只需要在一个地方实现注销代码。
答案 2 :(得分:2)
这就是我解决它的方法:
Intent intent = new Intent(context, ActivityLogin.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
使用API> = 11
答案 3 :(得分:0)
尝试使用FLAG_ACTIVITY_MULTIPLE_TASK
它应该像你现在一样工作,登录活动是root(luncher)活动吗?
您可以尝试onResume方法,像这样做
if(!login) {
finish();
}
看起来不太好但应该有用。
答案 4 :(得分:0)
您可以在登录活动中使用onbackpressed来定义在按下后退键时必须执行的操作
@Override
public void onBackPressed() {
//what it should do on back
}
答案 5 :(得分:0)
在您的注销活动按钮中单击
Button logout = (Button) findViewById(R.id.logout);
logout.setOnClickListener(new OnClickListener()
{
Intent myIntent = new Intent(CurrentActivity.this, LoginActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);// clear back stack
startActivity(myIntent);
finish();
});
在LoginActivity中单击“返回”按钮。如果LoginActivity是ClickA按钮上的MainActivity将完成活动并转到主屏幕
答案 6 :(得分:0)
这对我有用,试试这个......别忘了取消注册收件人 https://stackoverflow.com/a/3008684/3758898
答案 7 :(得分:0)
启动LoginActivity时添加以下参数可帮助您解决问题
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
A - 登录活动
B - 一些活动
C - 一些活动
D - 一些活动 - 从这些活动中注销并跳转到Login Activity。
以上标志将从内存中清除活动堆栈历史记录。因此您在按下后退按钮时没有获得其他活动
答案 8 :(得分:0)
Intent intent = new Intent(SourceActivity.this,DestinationActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
在进入登录活动或任何目的地活动之前使用此代码。所有将清除的堆栈中的所有活动。
希望这会对你有帮助。
答案 9 :(得分:0)
我希望这会有所帮助。
1)在用户点击退出按钮后,我使用构建器显示消息。
2)一旦用户点击"带我离开!",它将返回到主页面,当你按下设备上的后退按钮时,它将不会显示之前的活动。
logout=(Button)findViewById(R.id.btn_logout);
logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final AlertDialog.Builder builder = new AlertDialog.Builder(EngagementActivity.this);
builder.setTitle("Info");
builder.setMessage("Do you want to logout ??");
builder.setPositiveButton("Take me away!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent(EngagementActivity.this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
}
});
builder.setNegativeButton("Not now", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
答案 10 :(得分:0)
finishAffinity()
适用于API级别16 +