未用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
相关产品推荐
相关产品推荐

