Android多Activity跳转时如何从登录页A传递session token到C页面
问题原因
你之前的代码无法获取到token的核心原因是:C Activity的Intent是由B Activity启动时创建的,如果你没有把A中拿到的token逐层传递给B、再由B传递给C,C的Intent中不会携带对应的Extra字段,自然读取不到值。
可行实现方案
方案1:逐层Intent传参(符合Android官方组件通信规范,适合临时数据传递)
- 步骤1:A(登录页)拿到session token后,启动B时将token存入Intent
// 定义全局统一的Extra key,避免拼写错误 public static final String EXTRA_SESSION_TOKEN = "session_token"; // A中启动B的代码 Intent intent = new Intent(LoginActivity.this, HomeActivity.class); intent.putExtra(EXTRA_SESSION_TOKEN, 你从API获取到的sessionToken); startActivity(intent);
- 步骤2:B(首页)启动时先接收token,启动C时再传递给C
// B中定义成员变量存储token private String mSessionToken; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 接收A传递的token mSessionToken = getIntent().getStringExtra(EXTRA_SESSION_TOKEN); } // B中点击CardView启动C的代码 Intent intent = new Intent(HomeActivity.this, BusinessActivity.class); intent.putExtra(EXTRA_SESSION_TOKEN, mSessionToken); startActivity(intent);
- 步骤3:C中直接读取Intent中的token即可
String sessionToken = getIntent().getStringExtra(EXTRA_SESSION_TOKEN);
方案2:SharedPreferences持久化存储(适合登录凭证这类全局高频使用的数据)
登录态token本身属于需要跨页面、甚至重启APP后仍需保留的全局数据,优先推荐用这个方案,不需要逐层传递参数:
- 步骤1:A拿到token后存入SharedPreferences
SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE); sp.edit().putString("session_token", 你从API获取到的sessionToken).apply();
- 步骤2:任意页面(包括B、C)需要使用时直接读取
SharedPreferences sp = getSharedPreferences("app_config", MODE_PRIVATE); // 第二个参数为读取不到时的默认值 String sessionToken = sp.getString("session_token", ""); // 读取为空时说明未登录,可跳转回登录页A
方案3:全局单例类存储(适合APP运行期间临时存储全局公共数据)
// 自定义全局数据单例类 public class AppDataHolder { private static AppDataHolder INSTANCE; public String sessionToken; private AppDataHolder() {} public static AppDataHolder getInstance() { if (INSTANCE == null) { synchronized (AppDataHolder.class) { if (INSTANCE == null) { INSTANCE = new AppDataHolder(); } } } return INSTANCE; } } // A中拿到token后赋值 AppDataHolder.getInstance().sessionToken = 你从API获取到的sessionToken; // C中直接读取 String sessionToken = AppDataHolder.getInstance().sessionToken;
注意:该方案存在缺陷,APP进程被系统后台杀死后重启时,单例存储的值会为空,使用前必须做判空处理,为空时跳转回登录页。
内容的提问来源于stack exchange,提问作者Younes Be
相关产品推荐
相关产品推荐

