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

未用Shared Preferences保存会话:安卓双Activity登录状态留存问题

实现登录状态持久化,重启应用直接进入已登录页面

这问题核心就是利用SharedPreferences来持久化存储用户的登录状态,这样即使用户直接关闭应用,下次启动时我们也能读取到之前的登录状态,自动跳转到对应的页面。我给你整理了完整的代码实现,贴合你的需求:

步骤1:定义SharedPreferences常量(避免硬编码)

我们可以直接在Activity里定义常量,方便后续统一调用:

// SharedPreferences存储文件名
private static final String PREF_NAME = "UserSession";
// 标记登录状态的键名
private static final String KEY_IS_LOGGED_IN = "isLoggedIn";

步骤2:完善MainActivity(登录页)

在onCreate方法里,先检查登录状态——如果用户已经登录,直接跳转到第二个Activity;如果未登录,再加载登录界面。登录成功后,保存状态再跳转。

完整的MainActivity代码示例:

package com.example.user.store_session;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private static final String PREF_NAME = "UserSession";
    private static final String KEY_IS_LOGGED_IN = "isLoggedIn";
    private Button btnLogin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 优先检查登录状态
        SharedPreferences sharedPref = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
        boolean isLoggedIn = sharedPref.getBoolean(KEY_IS_LOGGED_IN, false);
        
        if (isLoggedIn) {
            // 已登录,直接跳转到第二个Activity
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
            // 结束当前Activity,避免返回键回到登录页
            finish();
            return;
        }
        
        // 未登录,加载登录界面
        setContentView(R.layout.activity_main);
        btnLogin = findViewById(R.id.btn_login);
        
        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 这里替换成你的实际登录验证逻辑(比如用户名密码校验)
                // 假设登录成功,保存登录状态
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putBoolean(KEY_IS_LOGGED_IN, true);
                editor.apply(); // 异步保存,比commit()更高效
                
                // 跳转到第二个Activity
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }
}

步骤3:完善SecondActivity(已登录页)

这个页面里,注销按钮需要清除登录状态并跳转回登录页;关闭按钮直接结束当前Activity即可——此时登录状态依然保存在SharedPreferences里,下次启动会直接回到这里。

完整的SecondActivity代码示例:

package com.example.user.store_session;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

    private static final String PREF_NAME = "UserSession";
    private static final String KEY_IS_LOGGED_IN = "isLoggedIn";
    private Button btnLogout;
    private Button btnClose;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        
        btnLogout = findViewById(R.id.btn_logout);
        btnClose = findViewById(R.id.btn_close);
        
        // 注销按钮逻辑
        btnLogout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 清除登录状态
                SharedPreferences sharedPref = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putBoolean(KEY_IS_LOGGED_IN, false);
                editor.apply();
                
                // 跳转回登录页
                Intent intent = new Intent(SecondActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        });
        
        // 关闭按钮逻辑
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 直接结束当前Activity,登录状态依然保留
                finish();
            }
        });
    }
}

关键注意点

  • SharedPreferences的模式:用Context.MODE_PRIVATE确保只有当前应用能访问存储文件,保证数据安全。
  • 跳转后finish():跳转后结束当前Activity,避免用户按返回键回到不需要的页面,提升体验。
  • 状态读取时机:在setContentView()之前检查登录状态,这样已登录用户不会看到登录界面的闪屏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:30:46