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

如何将服务器TOKEN存入Shared Preferences并在第二个Activity中使用?

问题解决建议

一、修复SharedPreferences存储Token的问题

你的代码核心问题有两个:

  • 定义了Preferences类但从未调用它的setAccessToken方法,导致存储逻辑根本没执行
  • 存储时错误地用login_token的内容作为SharedPreferences的key,这会导致每次token不同,key也跟着变,后续无法正确读取

修正后的代码示例:

  1. 把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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:10:39