6

我的应用程序中的所有活动都有注销按钮,用户可以从任何活动中注销。我想将用户发送到登录活动而不显示以前的活动。为此,我正在使用:

以下是注销方法删除会话

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 但这也没有实现我的目标。

我不明白我错在哪里。请问有人有解决办法吗。

提前致谢

4

11 回答 11

14

尝试指定这两个:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

同样为了安全起见,在开始此活动后调用 finish()。

于 2013-05-07T06:35:02.960 回答
10

最好的方法是在注销时在您的应用程序中使用 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();
}

注意:如果您有多个活动,则建议从一个基本活动扩展所有活动,并仅在基本活动中实现此本地广播管理器。这样您只需要在一个地方实现注销代码。

于 2014-03-19T19:29:17.960 回答
3

这就是我解决它的方法:

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

于 2016-04-11T06:21:26.453 回答
2
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);

在进入登录活动或任何目标活动之前使用此代码。因此堆栈中的所有活动都将被清除。

希望这会对您有所帮助。

于 2016-12-27T12:47:15.350 回答
1

finishAffinity()适用于 API 级别 16+

于 2018-04-03T10:49:41.703 回答
0

这对我有用,试试这个..不要忘记取消注册接收器 https://stackoverflow.com/a/3008684/3758898

于 2014-11-22T05:22:53.430 回答
0

尝试使用FLAG_ACTIVITY_MULTIPLE_TASK

它应该像您现在拥有的那样工作,登录活动是根(午餐)活动吗?

您可以尝试在 onResume 方法中这样做

if(!login) {
    finish();
}

看起来不太好,但应该可以。

于 2013-05-07T06:44:27.160 回答
0

您可以在您的登录活动中使用 onbackpressed 来定义它在按回键时必须执行的操作

@Override
public void onBackPressed() {
//what it should do on back
}
于 2013-05-07T06:47:00.090 回答
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 是 MainActivity 单击按钮将完成活动并转到主屏幕

于 2013-05-07T07:05:26.513 回答
0

在启动 LoginActivity 时添加以下参数将帮助您解决问题

意图.addFlags(意图.FLAG_ACTIVITY_CLEAR_TOP);

A - 登录活动

B - 一些活动

C - 一些活动

D - 一些活动 - 从这些活动中注销并跳转到登录活动。

上面的标志将从内存中清除活动堆栈历史记录。因此按下后退按钮时您不会获得其他活动

于 2016-10-24T12:09:55.030 回答
0

我希望这将有所帮助。

1)在用户单击注销按钮后,我使用了Builder来显示一条消息。

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();
                }
            });
于 2017-03-26T13:09:06.553 回答