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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:32:35