Android:退出时清除所有活动的完美方式?

时间:2013-05-07 06:33:40

标签: android

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

以下是注销方法删除会话

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

我不明白我错在哪里。请有人解决。

提前致谢

11 个答案:

答案 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 +