如何在不声明为public static时,让Activity C访问Activity A的城市列表?
嘿,这个场景在Android开发里太常见了!不用public static变量的话,有几种实用又靠谱的方案,我给你拆解清楚:
因为流程是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),页面跳转逻辑简单的情况。
如果你的项目用了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推荐的跨页面数据共享方式。
如果城市列表数据量很大,或者你需要持久化保存这份数据,可以把它存在本地,比如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

