Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:注销时清除所有活动的完美方式?_Android - Fatal编程技术网

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()中删除它,因为它没有引用活动。