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

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已废弃),实现步骤:

  1. 在卸货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
        }
    }
);
  1. 卸货页跳转位置录入页时,把当前已有的UnloadTask对象传递过去
Intent intent = new Intent(UnloadActivity.this, LocationInputActivity.class);
intent.putExtra("unload_task", currentUnloadTask); // 把当前已有的任务对象传过去
locationLauncher.launch(intent);
  1. 位置录入页拿到对象,更新位置信息后回传给卸货页
// 位置录入页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里的共享对象:

  1. 自定义Application类,声明共享的业务对象
public class App extends Application {
    private UnloadTask currentUnloadTask;

    public UnloadTask getCurrentUnloadTask() {
        return currentUnloadTask;
    }

    public void setCurrentUnloadTask(UnloadTask task) {
        this.currentUnloadTask = task;
    }
}
  1. 在AndroidManifest.xml的application标签中声明android:name=".App"
  2. 所有Activity中都可以直接获取和修改这个全局实例,不需要跨页面传递:
// 任意页面获取实例
UnloadTask task = ((App) getApplication()).getCurrentUnloadTask();
// 直接修改字段即可,所有页面拿到的都是同一个对象
task.setLocation("xxx");

注意这个方案的对象是存在内存中的,应用进程被杀后会丢失,如果需要持久化可以配合SharedPreferences或者Room数据库使用。

其他可选方案

如果你的项目已经引入了Jetpack架构组件,也可以用共享ViewModel实现同Activity下多个Fragment之间的对象共享,或者单Activity多Fragment的流程中数据共享,实现逻辑更简洁,不需要处理序列化和传递逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:36:01