------siwuxie095

传递值对象,即自定义的有数据类型的对象

1、首先
new 一个 class:User,用于创建自定义对象,同时右键 Generate


Constructor、setter 和 getter 方法(很简单,也可以手敲):

package com.siwuxie095.sendargs;

/**

* Created by siwux on 2017/1/2.

*/

public class User {

private String name;

private
int age;

public String getName() {

return name;

}

public
void setName(String name) {

this.name = name;

}

public
int getAge() {

return age;

}

public
void setAge(int age) {

this.age = age;

}

public User(String name, int age) {

this.name = name;

this.age = age;

}

}

2、在MainActivity.java中,如果直接加上

i.putExtra("user",new User("Bill",18));

就会报如下错误,即User的数据类型要么是 Parcelable(Android

平台用于序列化对象的接口),要么是
Serializable(Java语言内置

的用于序列化对象的接口):

3、二者的区别,分别实现一下即可知,先来实现
Serializable(与Parcelable

相比效率较低),在
User.java 中只做如下实现即可(所有序列化操作,系统

自动完成):

public class User implements Serializable

4、MainActivity.java 和 TheAty.java,代码一览:

package com.siwuxie095.sendargs;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

public class MainActivity extends AppCompatActivity {

@Override

protected
void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {

@Override

public
void onClick(View v) {

//创建一个new Intent()实例,传入Context和Class类型的参数

//对应MainActivity.this 和
被启动的Activity的类定义 TheAty.class

Intent i = new Intent(MainActivity.this,TheAty.class);

// //通过Intent对象,调用putExtra()方法,传参

// //这里传入String和String类型的参数,实际上就是键值对

// i.putExtra("data","你好
我是传递的参数");

// //传递数据包要用到Bundle,通过Bundle存入多种类型数据,传给第二个Activity

// Bundle b=new Bundle();

// //b.putBundle(); 即Bundle也可以嵌入Bundle

// b.putString("name","Jack");

// b.putInt("age",22);

// //putExtras() 传入Bundle

//// i.putExtras(b);

// //除了通过putExtras()传,还能用下面的putExra()

// i.putExtra("data",b);

i.putExtra("user",new User("Bill",18));

//传入i

startActivity(i);

}

});

}

}

package com.siwuxie095.sendargs;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

public class TheAty extends AppCompatActivity {

private TextView tv;

@Override

protected
void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_the_aty);

//TheAty是通过MainActivity中的Intent启动,直接通过getIntent()方法

//获取与这个Activity相关的Intent

Intent i=getIntent();

// //在第二个Activity 即TheAty 获取Bundle

//// Bundle data=i.getExtras();

// Bundle data=i.getBundleExtra("data");

//要访问TextView,先在上面声明

//findViewById()的返回值在编译时只能查看到类型是View,而事实上是TextView类型

//需要强制类型转换

tv= (TextView) findViewById(R.id.tv);

// //调用setText()方法设置字符串,这里字符串通过Intent获取

// tv.setText(i.getStringExtra("data"));

//需要做一个强制类型转换

User user= (User) i.getSerializableExtra("user");

//直接通过setText()方法传入字符串即可

tv.setText(String.format("User Info(name = %s, age = %d)",user.getName(),user.getAge()));

// //用到了String.format()

// // 假如有一个不存在的数据
如namex

// // 那么getString()有一个重载函数
可以设置默认值

// tv.setText(String.format("name = %s, age = %d, namex = %s",data.getString("name"),data.getInt("age"),data.getString("namex","Mary")));

}

}

5、运行一览:

6、再来实现
Parcelable,需要是实现两个方法,直接点击即可:

7、User.java,修改后:

package com.siwuxie095.sendargs;

import android.os.Parcel;

import android.os.Parcelable;

import java.io.Serializable;

/**

* Created by siwux on 2017/1/2.

*/

//public class User implements Serializable{

public class User implements Parcelable{

private String name;

private
int age;

public String getName() {

return name;

}

public
void setName(String name) {

this.name = name;

}

public
int getAge() {

return age;

}

public
void setAge(int age) {

this.age = age;

}

public User(String name, int age) {

this.name = name;

this.age = age;

}

//第一个方法不用管

@Override

public
int describeContents() {

return
0;

}

//向目标dest的Parcel里写数据
因为Parcelable没有全自动序列化机制
需要手动写

//将数据保存起来
方便传递给其他程序或Activity

@Override

public
void writeToParcel(Parcel dest, int flags) {

dest.writeString(getName());

dest.writeInt(getAge());

}

//还需创建一个Creator,泛型是User

public static final Creator<User> CREATOR = new Creator<User>() {

//createFromParcel() 通过一个Parcel来创建对象

@Override

public User createFromParcel(Parcel source) {

//直接返回一个new User()

// User中如果数据过多,也可以打包成Bundle

// 直接writeBundle() readBundle()即可

return new User(source.readString(),source.readInt());

}

@Override

public User[] newArray(int size) {

return new User[size];

}

}; //注意这里还要加分号

}

8、MainActivity.java 不变,TheAty.java只需接收时改为:

User user=i.getParcelableExtra("user");

TheAty.java:

package com.siwuxie095.sendargs;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

public class TheAty extends AppCompatActivity {

private TextView tv;

@Override

protected
void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_the_aty);

//TheAty是通过MainActivity中的Intent启动,直接通过getIntent()方法

//获取与这个Activity相关的Intent

Intent i=getIntent();

// //在第二个Activity 即TheAty 获取Bundle

//// Bundle data=i.getExtras();

// Bundle data=i.getBundleExtra("data");

//要访问TextView,先在上面声明

//findViewById()的返回值在编译时只能查看到类型是View,而事实上是TextView类型

//需要强制类型转换

tv= (TextView) findViewById(R.id.tv);

// //调用setText()方法设置字符串,这里字符串通过Intent获取

// tv.setText(i.getStringExtra("data"));

// 需要做一个强制类型转换

// User user= (User) i.getSerializableExtra("user");

//不需要强制类型转换

User user=i.getParcelableExtra("user");

//直接通过setText()方法传入字符串即可

tv.setText(String.format("User Info(name = %s, age = %d)",user.getName(),user.getAge()));

// //用到了String.format()

// // 假如有一个不存在的数据
如namex

// // 那么getString()有一个重载函数
可以设置默认值

// tv.setText(String.format("name = %s, age = %d, namex = %s",data.getString("name"),data.getInt("age"),data.getString("namex","Mary")));

}

}

9、总结:Serializable 操作简单,序列化由系统自动完成,所以速度慢,

Parcelable 操作复杂,需要手写,但Android平台支持更好,速度快

【made by siwuxie095】

Activity之间传递参数(三)的更多相关文章

  1. 在Activity之间传递参数(三)——serializable和parcelable的区别

    传递值对象: 一.serializable实现:简单易用 serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可.Serializable 接口是一种 ...

  2. Android学习总结——Activity之间传递参数

    核心内容:一.在 Activity 之间传递简单数据二.在 Activity 之间传递复杂数据 三.在 Activity 之间传递自定义值对象   软件环境:Android Studio   一.在 ...

  3. Activity之间传递参数(四)

    --------siwuxie095 获取Activity的返回参数 1.首先修改两个布局文件,都修改为 LinearLayout 布局, 添加orientation属性为:vertical. (1) ...

  4. 在Activity之间传递参数(四)

    获取Activity的返回参数(在参数(三)User的例子的基础上实现): 1.activity_the_aty.xml文件:<EditText android:id="@+id/ed ...

  5. Activity之间传递参数(二)

    ------siwuxie095 传递数据包 1.传递数据包要用到Bundle,MainActivity.java中: package com.siwuxie095.sendargs; import ...

  6. Activity之间传递参数(一)

    -------siwuxie095 传递简单数据 (1)首先创建一个项目:SendArgs (2)选择API:21 Android 5.0 (3)选择 Empty Activity (4)默认 (5) ...

  7. 在Activity之间传递参数(一)

    准备: 一.创建主界面:activity_main.xml文件中<Button android:text="启动另一个Activity" android:id="@ ...

  8. 在Activity之间传递参数(二)

    传递数据包bundle: 1.MainActivity.class: findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClic ...

  9. Activity之间传递大数据问题

    Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数.字符串.以及序列化的对象等.但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数 ...

随机推荐

  1. UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

  2. 使用localResizeIMG微信压缩上传图片安卓报错 weixin://preInjectJSBridge/fail

    微信上传图片是经常使用的功能,首先说一下使用的是:localResizeIMG进行图片压缩上传.感觉还是很好用,基本上功能都能满足. 但是最近在开发这个功能时遇到一个奇怪的问题,就是iphone|ip ...

  3. MySql绿色版下载,安装,配置详解

    下载完成之后解压,楼主用的版本是:mysql-5.7.15-winx64 解压完在根目录下建立一个data文件夹和my-default.ini my-default.ini里面的内容如下:(红色内容根 ...

  4. Android自动化学习笔记之Robotium:学习官网实例

    ---------------------------------------------------------------------------------------------------- ...

  5. @ResponseBody

    @Controller public class PersonController { /** * 查询个人信息 * * @param id * @return */ @RequestMapping( ...

  6. 傻瓜式操作Nagios

    傻瓜式操作Nagios   不少接触Nagios的朋友都会觉得安装配置困难,应用在企业网中所花费的时间成本很高,下面通过OSSIM来搞定它把. 为了节省资源,首先在淘汰的机器上安装一个低版本的OSSI ...

  7. tls/ssl证书生成和格式转换

    生成密钥:openssl genrsa -out my.key 2048 生成csr申请文件:openssl req -sha256 -new -key my.key -out my.csr 生成自签 ...

  8. .NET Framework 的 Quirk Version

    今天在CSDN上看到一个帖子 :".net 4.0和4.5不同版本的Uri.ToString行为不同?", 调试.NET Framework 源代码发现,是这句代码起的作用 int ...

  9. 【转】Java集合类

    http://blog.csdn.net/zhangerqing/article/details/8122075 http://android.blog.51cto.com/268543/400557 ...

  10. Socket原理与编程基础

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...