Android Activity跳转传递序列化实体类对象

本文介绍如何在 Android 应用中通过 Activity 跳转传递自定义实体类对象,包括实现 Parcelable 接口的具体步骤及注意事项,并附带完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       我发现自己真的好菜,想学点知识,可是不知道从何下手,今天一天状态确实很不好。实在无聊,写点以前遇到过的问题,方便以后用到时查看,更希望能与别人分享。

       本篇博客实现Android activity跳转的时候携带我自定义的实体类

       Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递序列化对象。同样如果我们想传递一个list<实体类>,只要在bundle调用putParcelableArrayList(key, value)即可,当然list里的对象要序例化!

   话不多说,上代码:

package com.weiwend.wj.testactivity;

import android.os.Parcel;
import android.os.Parcelable;

public class UserBean implements Parcelable{

	private String user_name;
	private int user_age;
	private int user_sex;
	private int user_addr;
	
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public int getUser_age() {
		return user_age;
	}
	public void setUser_age(int user_age) {
		this.user_age = user_age;
	}
	public int getUser_sex() {
		return user_sex;
	}
	public void setUser_sex(int user_sex) {
		this.user_sex = user_sex;
	}
	public int getUser_addr() {
		return user_addr;
	}
	public void setUser_addr(int user_addr) {
		this.user_addr = user_addr;
	}
	
	public static final Parcelable.Creator<UserBean> CREATOR=new Creator<UserBean>() {
		
		@Override
		public UserBean createFromParcel(Parcel source) {
			UserBean bean=new UserBean();
			
			bean.user_name=source.readString();
			bean.user_age=source.readInt();
			bean.user_sex=source.readInt();
			bean.user_addr=source.readInt();
			
			return bean;
		}
		
		@Override
		public UserBean[] newArray(int size) {
			// TODO Auto-generated method stub
			return new UserBean[size];
		}
	};
	
	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// TODO Auto-generated method stub
		dest.writeString(user_name);
		dest.writeInt(user_age);
		dest.writeInt(user_sex);
		dest.writeInt(user_addr);
	}
	
	
	
}</span><span style="font-size:12px;">
</span>
可以看到自定义类实现了Parcelable接口, Parcelable需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义(这里我遇到过问题,就是变量写入的数序一定要跟读取的数序一样,否则程序会崩溃,实际上Parcelable底层就是按顺序转成二进制码存储,读取的),而序列化的这些操作完全由底层实现,其中CREATOR用来创建自定义的Parcelable的对象.

接下来就是如何使用了:

MainActivity中,就放了一个button

public class MainActivity extends Activity {

	private Context context;
	
	private Button button;
	
	private UserBean userBean;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context=this;
		
		button=(Button) findViewById(R.id.btn);
		
		userBean=new UserBean();
		userBean.setUser_name("影魔");
		userBean.setUser_age(3);
		userBean.setUser_sex(1);
		userBean.setUser_addr("帝都");
		
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent=new Intent();
				Bundle bundle=new Bundle();
				bundle.putParcelable("user", userBean);
				intent.setClass(context, OtherActivity1.class);
				intent.putExtra("bundle", bundle);
				context.startActivity(intent);
			}
		});
	
	}

}
OtherActivity中,就放了一个textView

public class OtherActivity1 extends Activity {

	private TextView tv;
	
	private UserBean userBean;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_other1);
		
		tv=(TextView) findViewById(R.id.tv);
		
		Bundle bundle=(Bundle) getIntent().getExtras().get("bundle");
		userBean=(UserBean) bundle.getParcelable("user");
		
		tv.setText("name:"+userBean.getUser_name()+",age:"+userBean.getUser_age()+
				",sex:"+userBean.getUser_sex()+",addr:"+userBean.getUser_addr());
	}

}
再看一下运行效果吧。(哈哈,突出一个丑)


### 跨项目传递对象的方法及实现方式 在不同的软件开发场景中,跨项目传递对象的需求较为常见。对于Android应用而言,主要涉及的是组件间的数据交换机制;而对于Web应用程序,则更多涉及到前后端交互或是微服务架构下的数据传输。 #### Android 应用中的跨Activity对象传递 针对Android平台上的活动(Activity)之间的对象传递,可以采用如下几种方案: - **Bundle与序列化接口(Serializable/Parcelable)**:当需要在一个进程中不同Activity之间共享少量简单类型的对象时,可以通过Intent携带Bundle来完成[^1]。如果要传送复杂自定义类实例,则该类需实现`Serializable`或更高效的`Parcelable`接口以便于打包入Bundle中进行传递。 ```java // 发送方 Activity 中创建并填充 Bundle 对象 Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); MyObject obj = ...; // 假设这是一个实现了 Serializable 或 Parcelable 的对象 Bundle bundle = new Bundle(); bundle.putSerializable("key", (Serializable)obj); // 如果是 Parceable 则使用 putParceable 方法 intent.putExtra("data_bundle", bundle); startActivity(intent); ``` - **全局静态变量或Application子类**:适用于整个应用程序生命周期内都需要访问的对象。不过这种方式容易造成内存泄漏风险,并不推荐作为首选解决方案。 - **EventBus事件总线模式**:允许订阅者监听特定主题的消息更新,在某些情况下可用于间接地实现跨模块通信功能。 #### Web 开发环境下的跨项目对象传递 对于基于HTTP协议构建的服务端程序来说,通常会利用RESTful API或者GraphQL等技术栈来进行远程调用操作。客户端发送请求至服务器指定资源地址,附带必要的查询字符串、表单字段或者是JSON格式化的实体主体内容。服务器解析接收到的信息后返回响应给发起者的浏览器或其他消费工具处理。 另外一种情况是在前端框架(如Vue Router用于SPA)内部管理路由变化的同时支持参数附加到URL上供目标页面读取[^3]。 ```javascript // Vue Router 配置示例 const routes = [ { path: '/category/:id', name: 'CategoryDetail', component: CategoryDetailView, props: true // 启用此选项可使 route.params 自动映射为组件属性 } ]; ``` 最后值得注意的一点是,无论采取哪种手段实施跨项目的对象交流行为,都应当充分考虑到安全性因素以及性能优化措施,确保所选策略既满足业务逻辑又兼顾用户体验质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值