Android(Java)开发能否参照ASP.NET MVC实现同Activity多视图共用对象?
Android Java 多界面共享可变对象实现方案
完全可以实现和ASP.NET MVC跨视图共享对象一致的需求,以下是适配你场景的几种常用实现方式:
前置准备:业务对象实现Parcelable接口
Android跨Activity传递自定义对象需要先实现序列化,推荐用平台优化的Parcelable接口,性能远高于Java原生的Serializable,示例代码如下,模板代码可直接用Android Studio自动生成:
public class UnloadTask implements Parcelable { // 业务字段,可根据需求自定义,比如包裹信息、位置信息、状态标记等 private String packageInfo; private String location; // 构造方法、getter、setter逻辑自行实现 protected UnloadTask(Parcel in) { packageInfo = in.readString(); location = in.readString(); } public static final Creator<UnloadTask> CREATOR = new Creator<UnloadTask>() { @Override public UnloadTask createFromParcel(Parcel in) { return new UnloadTask(in); } @Override public UnloadTask[] newArray(int size) { return new UnloadTask[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(packageInfo); dest.writeString(location); } }
方案1:Activity回传机制(适配你当前卸货→录位置→返回卸货的场景)
你原本用startActivity跳转的思路是对的,配套Android的页面回传能力就可以实现对象的连续更新,推荐用AndroidX的Activity Result API(旧版startActivityForResult已废弃),实现步骤:
- 在卸货Activity中注册回传回调,接收位置录入页返回的更新后对象
// 卸货Activity里注册回调 ActivityResultLauncher<Intent> locationLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { // 拿到更新后的卸货任务对象,直接继续后续操作 UnloadTask updatedTask = result.getData().getParcelableExtra("unload_task"); // updatedTask已经包含了录入的位置信息,可以继续更新其他字段或者调用API } } );
- 卸货页跳转位置录入页时,把当前已有的UnloadTask对象传递过去
Intent intent = new Intent(UnloadActivity.this, LocationInputActivity.class); intent.putExtra("unload_task", currentUnloadTask); // 把当前已有的任务对象传过去 locationLauncher.launch(intent);
- 位置录入页拿到对象,更新位置信息后回传给卸货页
// 位置录入页onCreate里先拿到传递过来的任务对象 UnloadTask task = getIntent().getParcelableExtra("unload_task"); // 点击确认按钮后更新对象,回传 confirmBtn.setOnClickListener(v -> { // 更新位置字段 task.setLocation(inputLocationEt.getText().toString()); // 把更新后的对象放回返回Intent Intent resultIntent = new Intent(); resultIntent.putExtra("unload_task", task); setResult(Activity.RESULT_OK, resultIntent); finish(); // 关闭当前位置录入页,回到卸货页 });
这个方案和ASP.NET MVC中用TempData跨Action传递对象的逻辑完全一致,适合两个页面的单次数据传递更新场景。
方案2:全局共享实例(适合多步流程跨多个页面持续更新同一个对象)
如果你的卸货流程涉及超过2个页面,需要在多个Activity中连续修改同一个对象,可以直接在全局存储实例,类似ASP.NET MVC中存在Session里的共享对象:
- 自定义Application类,声明共享的业务对象
public class App extends Application { private UnloadTask currentUnloadTask; public UnloadTask getCurrentUnloadTask() { return currentUnloadTask; } public void setCurrentUnloadTask(UnloadTask task) { this.currentUnloadTask = task; } }
- 在AndroidManifest.xml的application标签中声明
android:name=".App" - 所有Activity中都可以直接获取和修改这个全局实例,不需要跨页面传递:
// 任意页面获取实例 UnloadTask task = ((App) getApplication()).getCurrentUnloadTask(); // 直接修改字段即可,所有页面拿到的都是同一个对象 task.setLocation("xxx");
注意这个方案的对象是存在内存中的,应用进程被杀后会丢失,如果需要持久化可以配合SharedPreferences或者Room数据库使用。
其他可选方案
如果你的项目已经引入了Jetpack架构组件,也可以用共享ViewModel实现同Activity下多个Fragment之间的对象共享,或者单Activity多Fragment的流程中数据共享,实现逻辑更简洁,不需要处理序列化和传递逻辑。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

