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

nil*_*ani 5 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);

}
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().


Sud*_*lip 9

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

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