Android登录后将用户JSON数据存入Session并跨Activity访问
嘿,别困惑啦!咱们用SharedPreferences来实现Session管理就好,这是Android里最常用的轻量级本地存储方案,刚好满足你存用户数据、后续按需读取的需求。下面一步步来实现:
1. 先写一个Session管理工具类(SessionManager)
这个类封装了SharedPreferences的操作,负责保存、读取和清除用户会话数据:
import android.content.Context; import android.content.SharedPreferences; import org.json.JSONObject; public class SessionManager { private SharedPreferences sharedPreferences; private SharedPreferences.Editor editor; private static final String PREF_NAME = "VendorSession"; private static final String IS_LOGGED_IN = "isLoggedIn"; // 定义用户数据的键名,和返回的JSON字段一一对应 public static final String KEY_ID = "ID"; public static final String KEY_FIRM_NAME = "FIRM_NAME"; public static final String KEY_CONTACT_NO = "CONTACT_NO"; public static final String KEY_FIRM_EMAIL = "FIRM_EMAIL"; public static final String KEY_STATE = "STATE"; // 可以把userdata里所有你需要的字段都照着这个格式列出来 public SessionManager(Context context) { sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); editor = sharedPreferences.edit(); } // 保存用户会话数据 public void saveUserSession(JSONObject userData) { try { editor.putBoolean(IS_LOGGED_IN, true); // 逐个取出JSON里的字段存进SharedPreferences editor.putString(KEY_ID, userData.getString(KEY_ID)); editor.putString(KEY_FIRM_NAME, userData.getString(KEY_FIRM_NAME)); editor.putString(KEY_CONTACT_NO, userData.getString(KEY_CONTACT_NO)); editor.putString(KEY_FIRM_EMAIL, userData.getString(KEY_FIRM_EMAIL)); editor.putString(KEY_STATE, userData.getString(KEY_STATE)); // 把其他需要的字段都补充进来 editor.apply(); } catch (Exception e) { e.printStackTrace(); } } // 读取单个用户数据 public String getUserDetail(String key) { return sharedPreferences.getString(key, null); } // 判断用户是否已登录 public boolean isLoggedIn() { return sharedPreferences.getBoolean(IS_LOGGED_IN, false); } // 清除会话(登出) public void logout() { editor.clear(); editor.apply(); } }
2. 修改LoginActivity的登录成功逻辑
在你现有的Login代码里,把登录成功返回的userdata存进Session:
首先,修正你的Session变量类型(原来的private Session session;改成private SessionManager sessionManager;),然后在onCreate方法里初始化:
sessionManager = new SessionManager(Login.this);
然后在onResponse的登录成功分支里,添加存储逻辑:
if (Integer.parseInt(jobject.getString("status")) == 200) { Toast.makeText(getApplicationContext(), "Login Success", Toast.LENGTH_LONG).show(); // 解析返回的userdata并存储到Session JSONObject userData = jobject.getJSONObject("userdata"); sessionManager.saveUserSession(userData); Intent i = new Intent(Login.this, MainActivity.class); startActivity(i); finish(); }
3. 在其他Activity中读取用户数据
比如在MainActivity里,你可以这样按需读取单个数据元素:
public class MainActivity extends AppCompatActivity { private SessionManager sessionManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sessionManager = new SessionManager(MainActivity.this); // 先检查是否已登录,未登录就跳回登录页 if (!sessionManager.isLoggedIn()) { Intent intent = new Intent(MainActivity.this, Login.class); startActivity(intent); finish(); return; } // 按需读取数据,比如获取公司名称 String firmName = sessionManager.getUserDetail(SessionManager.KEY_FIRM_NAME); // 获取联系电话 String contactNo = sessionManager.getUserDetail(SessionManager.KEY_CONTACT_NO); // 获取所在省份 String state = sessionManager.getUserDetail(SessionManager.KEY_STATE); // 接下来就可以把这些数据显示到UI上或者做其他业务处理了 } }
一些注意事项
- 所有需要的userdata字段,都要在SessionManager里定义对应的KEY,并在
saveUserSession方法里完成保存。 - SharedPreferences是持久化存储的,除非用户清除App数据或者调用
logout方法,数据会一直保留在本地。 - 记得在需要登录才能访问的页面(比如MainActivity)先判断登录状态,防止未登录用户直接进入。
内容的提问来源于stack exchange,提问作者Abm
相关产品推荐
相关产品推荐

