Android:如何在所有Activity创建前统一执行用户信息加载的HTTP请求?
解决每个Activity获取用户信息的统一方案
1. 用自定义Application做全局初始化
可以创建自己的Application类,在它的onCreate()方法里统一加载用户信息——这个方法会在所有Activity启动前执行,包括应用从内存被回收后重启的场景。
代码示例
首先定义Application类:
public class MyApp extends Application { private User currentUser; @Override public void onCreate() { super.onCreate(); // 在这里统一从缓存加载用户信息 loadUserFromCache(); } private void loadUserFromCache() { // 从SharedPreferences读取,也可以用数据库/文件缓存 SharedPreferences sp = getSharedPreferences("user_cache", MODE_PRIVATE); String userId = sp.getString("user_id", null); if (userId != null) { currentUser = new User(userId, sp.getString("user_name", "")); } } // 全局获取用户信息的方法 public User getCurrentUser() { return currentUser; } // 更新用户信息时同步缓存和内存对象 public void updateUser(User user) { currentUser = user; SharedPreferences.Editor editor = getSharedPreferences("user_cache", MODE_PRIVATE).edit(); editor.putString("user_id", user.getId()); editor.putString("user_name", user.getName()); editor.apply(); } }
然后在AndroidManifest.xml里注册这个Application:
<application android:name=".MyApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApp"> <!-- 你的Activity声明 --> </application>
之后在任意Activity里直接获取:
User currentUser = ((MyApp) getApplication()).getCurrentUser();
2. 抽象BaseActivity做兜底检查
如果担心Application初始化时加载失败(比如缓存损坏),可以写一个所有Activity都继承的BaseActivity,在它的onCreate()里检查用户信息是否存在,不存在就做兜底处理(比如跳登录页)。
代码示例
public abstract class BaseActivity extends AppCompatActivity { protected User currentUser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); checkAndInitUser(); } private void checkAndInitUser() { MyApp app = (MyApp) getApplication(); currentUser = app.getCurrentUser(); // 如果用户信息为空,直接跳登录 if (currentUser == null) { startActivity(new Intent(this, LoginActivity.class)); finish(); return; } // 这里可以做用户信息的后续初始化(比如拉取最新数据) } }
业务Activity直接继承BaseActivity即可:
public class HomeActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); // 直接使用父类的currentUser对象 tvUserName.setText(currentUser.getName()); } }
关键注意点
- 不要在Application的
onCreate()里做耗时操作,比如网络请求——会拖慢应用启动速度,这类操作可以放在SplashActivity或者BaseActivity里异步执行。 - 用户信息必须存本地缓存(SharedPreferences/数据库),只存在内存里的话,进程被回收后会丢失,没办法恢复。
- 用户登录、退出、信息更新时,一定要同步更新Application里的对象和本地缓存,保证全局一致性。
内容的提问来源于stack exchange,提问作者Vitaliy Tsirkunov
相关产品推荐
相关产品推荐

