我的应用程序中具有"注销"按钮和用户的所有活动都可以从任何活动中注销.我想将用户发送到登录活动而不显示以前的活动.为此,我正在使用:
以下是注销方法删除会话
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);
}
Run Code Online (Sandbox Code Playgroud)
从用户单击注销按钮然后注销方法调用的第二个活动.我的第二个活动类扩展了SherlockFragmentActivity.
public void Logout(MenuItem v) {
sessionMngr.logoutUser();
}
Run Code Online (Sandbox Code Playgroud)
当我按下注销按钮时,我进入登录界面,但是当我按下设备上的后退按钮时,它显示以前的活动 - 当我在登录屏幕中按下后退按钮时,我应该转到Android主屏幕.
我在stackoverflow上看到了一些问题,但没有实现我的目标.有人说我在清单文件中使用android:noHistory ="true",但是当我在第三个活动中并按回按钮时它会显示android主屏幕,但它应该转到第二个活动.我也尝试过FLAG_ACTIVITY_NO_HISTORY,但这也没有实现我的目标.
我不明白我错在哪里.请有没有人有解决方案.
提前致谢
Cho*_*hun 13
尝试指定以下两个:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Run Code Online (Sandbox Code Playgroud)
同样为安全起见,请在开始此活动后调用finish().
最好的方法是在注销时在应用程序中使用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);
}
Run Code Online (Sandbox Code Playgroud)
现在所有的活动都应该听这个广播.活动看起来像
@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();
}
Run Code Online (Sandbox Code Playgroud)
注意:如果您有多个活动,则建议从基本活动扩展所有活动,并仅在基本活动中实施此本地广播管理器.因此,您只需要在一个地方实现注销代码.