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

如何在不声明为public static时,让Activity C访问Activity A的城市列表?

嘿,这个场景在Android开发里太常见了!不用public static变量的话,有几种实用又靠谱的方案,我给你拆解清楚:

方案1:通过Intent链式传递数据(简单直接)

因为流程是A→B→C,咱们可以把城市列表从A传递给B,再由B传递给C。不过要注意:列表里的实体类必须实现Serializable或者Parcelable接口,这样才能通过Intent传输。

举个代码例子:
在Activity A中,获取到城市列表后启动B:

// 假设cityList是已经获取到的List<City>,City类实现了Parcelable
Intent intent = new Intent(A.this, B.class);
intent.putParcelableArrayListExtra("KEY_CITY_LIST", new ArrayList<>(cityList));
startActivity(intent);

在Activity B中,点击按钮启动C时把数据传过去:

button.setOnClickListener(v -> {
    // 先从自己的Intent里拿到城市列表
    List<City> cityList = getIntent().getParcelableArrayListExtra("KEY_CITY_LIST");
    Intent intent = new Intent(B.this, C.class);
    intent.putParcelableArrayListExtra("KEY_CITY_LIST", new ArrayList<>(cityList));
    startActivity(intent);
});

最后在Activity C中获取数据:

List<City> cityList = getIntent().getParcelableArrayListExtra("KEY_CITY_LIST");
// 把数据绑定到下拉列表即可

👉 适用场景:数据量不大(Intent传输有大小限制,一般不超过1MB),页面跳转逻辑简单的情况。

方案2:使用共享ViewModel(优雅推荐)

如果你的项目用了Jetpack组件,那共享ViewModel绝对是最优解——它能在多个Activity/Fragment之间安全共享数据,还自带生命周期感知,不用担心页面重建丢失数据。

第一步,创建一个共享的ViewModel类:

public class CitySharedViewModel extends ViewModel {
    private final MutableLiveData<List<City>> cityListLiveData = new MutableLiveData<>();

    // 设置城市列表数据
    public void setCityList(List<City> cityList) {
        cityListLiveData.setValue(cityList);
    }

    // 提供观察者获取数据
    public LiveData<List<City>> getCityListLiveData() {
        return cityListLiveData;
    }
}

然后在Activity A中,获取ViewModel并设置数据:

CitySharedViewModel viewModel = new ViewModelProvider(this).get(CitySharedViewModel.class);
// 假设已经获取到cityList
viewModel.setCityList(cityList);

最后在Activity C中,获取同一个ViewModel并监听数据:

CitySharedViewModel viewModel = new ViewModelProvider(this).get(CitySharedViewModel.class);
viewModel.getCityListLiveData().observe(this, cityList -> {
    // 拿到数据后直接绑定到下拉列表
});

👉 适用场景:需要跨多个页面共享数据,或者担心页面重建导致数据丢失的情况,这也是Google推荐的跨页面数据共享方式。

方案3:本地临时存储(适合大数据量)

如果城市列表数据量很大,或者你需要持久化保存这份数据,可以把它存在本地,比如SharedPreferences(适合简单数据)或者Room数据库(适合复杂数据)。

这里用SharedPreferences+Gson举个例子:
在Activity A中,把列表转成JSON字符串存储:

// 先把List转成JSON字符串
Gson gson = new Gson();
String cityListJson = gson.toJson(cityList);

// 存入SharedPreferences
SharedPreferences sp = getSharedPreferences("TEMP_CITY_DATA", MODE_PRIVATE);
sp.edit().putString("KEY_CITY_LIST", cityListJson).apply();

在Activity C中,读取并解析数据:

SharedPreferences sp = getSharedPreferences("TEMP_CITY_DATA", MODE_PRIVATE);
String cityListJson = sp.getString("KEY_CITY_LIST", null);

if (cityListJson != null) {
    Gson gson = new Gson();
    // 解析回List<City>
    List<City> cityList = gson.fromJson(cityListJson, new TypeToken<List<City>>(){}.getType());
    // 绑定到下拉列表
}

👉 适用场景:数据量较大,或者需要临时持久化数据的情况。记得用完后可以清理掉这份临时数据,避免占用存储空间。


内容的提问来源于stack exchange,提问作者rav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:53:11