当我进入一个活动时,清除活动栈

3
我正在处理一个有几个活动的应用程序,问题是我希望用户能够通过按下按钮注销。假设我们有4个名为A、B、C、D的活动。活动的导航方式如下:B->C->D。在D活动中,用户可以选择注销选项。当用户单击注销按钮时,他进入了未在导航中调用的A活动。现在,用户单击返回按钮,然后回到上一个活动,如D活动。我已经尝试使用以下两个标志启动活动:
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

有人可以帮忙吗?

4个回答

4

好的,我做了一个小项目来模拟你现在的情况。下面的代码中我会省略掉导入部分。另外请读完整段代码和注释,我写这些不是让你跳过它们的。我们将称这几个类为splash、login、page1、page2和page3。在你的splash类中,在onCreate()方法之前,让我们加入一些东西。

package com.test.jeets;

public class splash extends Activity {

    //Add all of these right here!
    public static boolean loggedin = false;
    public static int sdk = new Integer(Build.VERSION.SDK).intValue();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        //This is your splash screen, all the code goes here!
    }
}

现在这就是你的启动画面!完成了!对于登录界面,我们需要确保它不能返回到启动画面,而是在按下返回键时退出应用程序。那很简单!让我们重写返回按钮并使用moveTaskToBack(true)即可。
package com.test.jeets;

public class login extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        //This is the login page stuff. Nothing special needs done here.
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (splash.sdk < 5 && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            onBackPressed();
        }

        return super.onKeyDown(keyCode, event);
    }
    //This will make the back button exit the app to the home screen.
    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
        return;
    }
    //If the user leaves the app from the login screen while not logged in, they are returned to the splash screen.
    @Override
    public void onRestart() {
        super.onRestart();
        if(splash.loggedin == false){
        Intent i = new Intent(login.this, splash.class);
        startActivity(i);}
    }
}

现在,这个任务已经完成了!让我们转到您的第一个页面(即登录后跳转的页面),并在 onCreate() 方法中添加一行代码。
splash.loggedin = true;

您可能需要考虑让用户退出此页面时也注销他们的登录状态。这不是必需的,但肯定可行。

最后一件要做的事情是在用户使用注销按钮注销时将该变量设置为false。因此,在按钮的代码中,在再次启动登录活动之前,只需添加splash.loggedin = false;。现在,当用户单击按钮时,它将注销用户,将变量设置为false,并将其带到登录屏幕。就像我说的,我用一个简单的布局和基本的活动切换进行了测试,对我来说效果很好。


但是对于我来说,当我在登录活动中按下返回按钮时,我有一个闪屏活动,然后我能够退出应用程序,但是当我再次启动应用程序时,我看不到闪屏活动,我从登录活动开始。因此,我希望在再次启动应用程序时能够看到闪屏屏幕。如果您能给我另一个建议,请帮助我。 - Jitendra
在结尾添加了一点内容,应该会有所帮助。 - Rob
我不确定如何使用它。请帮帮我,我遇到了这个问题。 - Jitendra
一旦SDK和ADT插件安装好,我会组织一个例子。 - Rob
谢谢回复,但这对我来说不是解决方案。当我离开应用程序时,我希望退出应用程序而不是返回到启动画面。但是当我再次启动应用程序时,我希望返回到启动画面。但在我的情况下,我进入了登录活动。请帮助我。 - Jitendra
显示剩余9条评论

3
请在您的“Activity D”注销事件中尝试此方法。

Button button = (Button) findViewById(R.id.btnLogout);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        Intent intent = new Intent(context, ActivityA.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
    }
});

我已经尝试过了。如果您有其他选项,请告诉我。 - Jitendra

1

尝试

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

你在第二次调用中移除了FLAG_ACTIVITY_NEW_TASK。


谢谢回复,但它没有起作用。你有另一个解决方案吗? - Jitendra
对我来说可以这样做...我使用相同的标志启动仪表板活动。 - Roman Mazur
对我来说它不起作用,当我按下返回按钮时,我进入的不是注销活动而是之前的活动。如果您有其他解决方案,请回复我。 - Jitendra

1

终于这段代码对我有用了......

当我在登录界面按返回按钮时,我将回到 Android 设备的主屏幕。

Intent intent= new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接