Android:注销时清除所有活动的完美方式?
我的应用程序中的所有活动都有注销按钮,用户可以从任何活动中注销。我想向用户发送登录活动,而不显示以前的活动。为此,我使用: 以下是删除会话的注销方法Android:注销时清除所有活动的完美方式?,android,Android,我的应用程序中的所有活动都有注销按钮,用户可以从任何活动中注销。我想向用户发送登录活动,而不显示以前的活动。为此,我使用: 以下是删除会话的注销方法 public void logoutUser() { //clearing all data from sharedPreferences editor.clear(); editor.commit(); Intent intnt = new Intent(contxt, LoginActivity.class);
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);
}
从第二个活动开始,用户单击注销按钮,然后调用注销方法。我的第二个活动类扩展了SherlockFragmentActivity
public void Logout(MenuItem v) {
sessionMngr.logoutUser();
}
当我按下注销按钮时,我会进入登录屏幕,但当我按下设备上的后退按钮时,它会显示以前的活动-当我按下登录屏幕上的后退按钮时,我应该进入Android主屏幕
我看到了一些关于stackoverflow的问题,但没有达到我的目标。有人说我在清单文件中使用android:noHistory=“true”,但当我在第三个活动中按下按钮时会发生什么,它会显示android主屏幕,但应该转到第二个活动。我也尝试了FLAG_ACTIVITY_NO_HISTORY,但这也没有达到我的目标
我不明白我错在哪里。请问有没有人有解决办法
提前感谢请尝试指定以下两项:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
此外,为了安全起见,请在启动此活动后调用finish()。尝试使用
它应该像现在一样工作,登录活动是根(午餐)活动吗
你可以尝试在onResume方法中这样做
if(!login) {
finish();
}
看起来不太好,但应该可以工作。您可以在loginactivity中使用onbackpressed来定义它在按backkey键时必须执行的操作
@Override
public void onBackPressed() {
//what it should do on back
}
在“注销时的活动”按钮中,单击
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是主要活动,单击按钮将完成活动并转到主屏幕,最好的方法是在注销时在应用程序中使用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();
}
注意:如果您有多个活动,建议从基本活动扩展所有活动,并仅在基本活动中实施此本地广播管理器。因此,您只需要在一个位置实现注销代码。这对我来说是可行的,试试这个。。别忘了取消注册
我就是这样解决的:
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启动LoginActivity时添加以下参数将帮助您解决问题 intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP) A-登录活动 B-一些活动 C-一些活动 D-某些活动-从这些活动注销并跳转到登录活动 上面的标志将从内存中清除活动堆栈历史记录。因此,按下“上一步”按钮时,您不会获得其他活动
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);
在转到登录活动或任何目标活动之前使用此代码。因此,堆栈中的所有活动都将被清除
希望这会对你有所帮助。我希望这会有所帮助 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();
}
});
finishafinity()
适用于API级别16+Intent.FLAG\u ACTIVITY\u CLEAR\u任务此字段需要API级别11。我已经使用了FLAG\u ACTIVITY\u NEW\u任务。请参见上面的code新任务不够清除任务将不会留下任何历史记录,很抱歉没有注意到它不能在API 11下使用。在这里我帮不了你。@nileshwani在搜索了我以前的项目后,我发现以前,我为我的每一个活动都分配了一个广播侦听器,所以每当我打开需要作为新任务的内容时,我都会发送一个广播,他们会调用finish(),上面的代码有什么问题,这与我刚刚编写的onclick事件类似,比如“Logout”。我无法调用finish方法bcoz这不是activity类。当您在中完成当前活动时,将从后堆栈弹出,并显示后堆栈中的上一个活动。由于清除了后台堆栈,它将导航到LoginActivity。您还可以像((活动)context.finish()一样调用finish()的上下文;当我编写((活动)context.finish()时,它遇到了类似ClassCastExceptionNice解决方案的异常,请从这个.finish()中删除它,因为它没有引用活动。