You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio登录登出后返回键异常问题排查求助

问题分析与修复方案

你的两个异常都是任务栈管理不当和代码逻辑疏漏导致的,以下是具体问题和修复步骤:


一、登录成功后按返回键回到登录页面的问题

问题根源

  1. Facebook登录与Google登录跳转的目标Activity不一致(Facebook跳Dashboard_buy,Google跳Dashboard),导致任务栈混乱;
  2. 部分代码中finish()与startActivity()的顺序虽不影响功能,但存在不规范的写法;
  3. 未明确清理任务栈中残留的登录页实例。

修复步骤

  1. 统一跳转目标Activity
    将Facebook登录回调中的跳转目标改为Dashboard(与Google登录保持一致):

    @Override
    public void onSuccess(LoginResult loginResult) {
        startActivity(new Intent(CustomerLogin.this, Dashboard.class));
        finish();
    }
    
  2. 规范页面跳转逻辑(可选)
    将finish()放在startActivity()之后,确保新页面启动后再销毁登录页:

    private void login() {
        Intent intent = new Intent(getApplicationContext(), Dashboard.class);
        startActivity(intent);
        finish();
    }
    
  3. 添加任务栈清理标志(可选)
    如果希望登录页彻底从返回栈中移除,给跳转Intent添加标志:

    Intent intent = new Intent(CustomerLogin.this, Dashboard.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    finish();
    

二、登出后按返回键回到已登录状态页面的问题

问题根源

  1. 登出时仅启动登录页,未销毁之前的Dashboard宿主Activity,导致任务栈中仍保留已登录状态的页面;
  2. 错误调用finalize()方法(该方法用于垃圾回收,手动调用无意义且可能引发异常);
  3. Fragment未在页面恢复时重新检查登录状态,导致UI未更新。

修复步骤

  1. 登出时销毁宿主Activity
    在跳转到登录页前,调用getActivity().finish()销毁Dashboard,确保任务栈中仅保留登录页:

    // Google登出方法修改
    private void SignOut() {
        gsc.signOut().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                startActivity(new Intent(getActivity(), CustomerLogin.class));
                getActivity().finish(); // 销毁Dashboard
            }
        });
    }
    
    // Facebook登出点击事件修改
    logoutfbBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            LoginManager.getInstance().logOut();
            startActivity(new Intent(getActivity(), CustomerLogin.class));
            getActivity().finish(); // 销毁Dashboard
        }
    });
    
  2. 移除错误的finalize()调用
    彻底删除代码中所有try { finalize(); } catch(Throwable e) {}的代码块。

  3. 优化Fragment登录状态检查
    在onResume()中重新检查登录状态,确保页面恢复时UI自动更新:

    @Override
    public void onResume() {
        super.onResume();
        GoogleSignInAccount acc = GoogleSignIn.getLastSignedInAccount(getContext());
        updateUI(acc);
    }
    
    private void updateUI(GoogleSignInAccount acc) {
        if (acc != null) {
            String Name = acc.getDisplayName();
            String Mail = acc.getEmail();
            name.setVisibility(View.VISIBLE);
            mail.setVisibility(View.VISIBLE);
            logoutGoogleBtn.setVisibility(View.VISIBLE);
            logoutfbBtn.setVisibility(View.GONE);
    
            name.setText(Name);
            mail.setText(Mail);
        } else {
            // 未登录状态,隐藏用户信息
            name.setVisibility(View.GONE);
            mail.setVisibility(View.GONE);
            logoutGoogleBtn.setVisibility(View.GONE);
            logoutfbBtn.setVisibility(View.VISIBLE);
        }
    }
    
  4. 修正Fragment变量定义错误
    代码中存在重复赋值、未定义变量的问题(如logoutbtn未定义,logoutGoogleBtn重复赋值),需修正:

    // 修正变量定义
    private Button logoutGoogleBtn, logoutfbBtn;
    
    // 修正初始化代码
    logoutGoogleBtn = v.findViewById(R.id.logoutGoogleBtn);
    logoutfbBtn = v.findViewById(R.id.logoutfbBtn); // 对应XML中的Facebook登出按钮ID
    

额外代码优化建议

  • 移除Login_Activity和Account_Fragment中重复的findViewById调用;
  • 结合Firebase Auth的getCurrentUser()方法统一管理登录状态,避免Google/Facebook登录状态不一致;
  • 给按钮点击事件添加防重复点击逻辑,避免多次触发跳转。

内容的提问来源于stack exchange,提问作者user19703138

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:06:02