如何将服务器TOKEN存入Shared Preferences并在第二个Activity中使用?
问题解决建议
一、修复SharedPreferences存储Token的问题
你的代码核心问题有两个:
- 定义了
Preferences类但从未调用它的setAccessToken方法,导致存储逻辑根本没执行 - 存储时错误地用
login_token的内容作为SharedPreferences的key,这会导致每次token不同,key也跟着变,后续无法正确读取
修正后的代码示例:
- 把
Preferences类独立出来(放在MainActivity外部,或单独写工具类):
class Preferences { // 用固定的key存token,不要用token内容当key private static final String KEY_ACCESS_TOKEN = "ACCESS_TOKEN"; public void setAccessToken(@NonNull Context context, String token) { SharedPreferences sharedPreferences = context.getSharedPreferences("MySharedPref", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(KEY_ACCESS_TOKEN, token); // 固定key存储 editor.apply(); } // 新增读取token的方法,方便后续调用 public String getAccessToken(@NonNull Context context) { SharedPreferences sharedPreferences = context.getSharedPreferences("MySharedPref", Context.MODE_PRIVATE); return sharedPreferences.getString(KEY_ACCESS_TOKEN, null); } }
- 在MainActivity的成功回调里调用存储方法:
if (response.isSuccessful()) { String myResponse = response.body().string(); MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { try { JSONObject obj = new JSONObject(myResponse); System.out.println(obj.getString("status")); System.out.println(obj.getString("status_desc")); String loginToken = obj.getString("login_token"); System.out.println(loginToken); if (obj.optString("status").equals("Y")) { // 实例化Preferences并执行存储 new Preferences().setAccessToken(MainActivity.this, loginToken); Intent intent = new Intent(MainActivity.this, MainActivity2.class); intent.putExtra("AccessToken", loginToken); startActivity(intent); } else { new AlertDialog.Builder(MainActivity.this) .setTitle("WARNING!") .setMessage(obj.getString("status_desc")) .setPositiveButton(android.R.string.ok, null) .show(); } } catch (JSONException e) { // 不要忽略异常,打印日志便于排查 e.printStackTrace(); } } }); }
二、在第二个Activity(MainActivity2)中使用Token
有两种获取方式:
方式1:从Intent中获取(你原本已传递)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 获取MainActivity传递的token String tokenFromIntent = getIntent().getStringExtra("AccessToken"); // 后续使用token... }
方式2:从SharedPreferences中读取(更推荐,App重启后仍能获取)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); // 用Preferences类读取存储的token String tokenFromSP = new Preferences().getAccessToken(this); // 后续使用token... }
额外注意事项
- 不要在匿名内部类里嵌套定义类(比如之前在run方法里定义Preferences),会导致代码混乱且不易复用
- JSON解析必须捕获
JSONException,避免崩溃 - 建议把SharedPreferences操作封装成单例工具类,全局复用
内容的提问来源于stack exchange,提问作者kimhong toh
相关产品推荐
相关产品推荐

