① android activity之间怎么传对象数据
StartActivity的时候将数据携带到Intent的bundle里,如果要携带自定义的对象,你自定义的对象要实现Serializable接口,就是在类里加一个implement Serializable。
然后
Intent intent = new Intent(this, Activity2);
Bundle bundle = new Bundle();
bundle.putSerializable("参数名", 自定义对象);
intent.putExtras(bundle);
startActivity(intent);
就可以把参数带过去了,
取的时候用
getIntent().getSerializableExtra("参数名")
就可以取到你传过来的对象了
强转一下类型就能用了
② android调用webservice怎么传递对象
1.webservice方法要传递参数的对象中包含了日期类型,guid类型。如下所示:
[html] view plain
POST /MyWebService.asmx HTTP/1.1
Host: 192.168.11.62
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/AddMaintenanceInfo"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<AddMaintenanceInfo xmlns="http://tempuri.org/">
<model>
<Id>guid</Id>
<CarId>guid</CarId>
<Cost>string</Cost>
<Dates>dateTime</Dates>
</model>
</AddMaintenanceInfo>
</soap:Body>
</soap:Envelope>
2.新建一个类CarMaintenanceInfo用于传递参数对象,并使其实现KvmSerializable,如下
[java] view plain
public class CarMaintenanceInfo implements KvmSerializable {
/**
* 车辆ID
*/
public String CarId;
/**
* 车辆维修费用
*/
public String Cost;
public String Dates;
@Override
public Object getProperty(int arg0) {
switch (arg0) {
case 0:
return CarId;
case 1:
return Cost;
case 2:
return Dates;
default:
break;
}
return null;
}
@Override
public int getPropertyCount() {
return 3;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch (arg0) {
case 0:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "CarId";
break;
case 1:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Cost";
break;
case 2:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Dates";
break;
default:
break;
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch (arg0) {
case 0:
CarId = arg1.toString();
break;
case 1:
Cost = arg1.toString();
break;
case 2:
Dates = arg1.toString();
break;
default:
break;
}
}
}
注意:getPropertyCount的值一定要与该类对象的属性数相同,否则在传递到服务器时,服务器收不到部分对象的属性。
3.编写请求方法,如下:
[java] view plain
public boolean addMaintenanceInfo(Context context) throws IOException, XmlPullParserException {
String nameSpace = "http://tempuri.org/";
String methodName = "AddMaintenanceInfo";
String soapAction = "http://tempuri.org/AddMaintenanceInfo";
String url = "http://192.168.11.62:6900/MyWebService.asmx?wsdl";// 后面加不加那个?wsdl参数影响都不大
CarMaintenanceInfo info = new CarMaintenanceInfo();
info.setProperty(0, "9fee02c9-8785-4b49-b389-58ed6562c66d");
info.setProperty(1, "12778787");
info.setProperty(2, "2013-07-29T16:45:20");
// 建立webservice连接对象
org.ksoap2.transport.HttpTransportSE transport = new HttpTransportSE(url);
transport.debug = true;// 是否是调试模式
// 设置连接参数
SoapObject soapObject = new SoapObject(nameSpace, methodName);
PropertyInfo objekt = new PropertyInfo();
objekt.setName("model");
objekt.setValue(info);
objekt.setType(info.getClass());
soapObject.addProperty(objekt);
// 设置返回参数
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);// soap协议版本必须用SoapEnvelope.VER11(Soap
// V1.1)
envelope.dotNet = true;// 注意:这个属性是对dotnetwebservice协议的支持,如果dotnet的webservice
// 不指定rpc方式则用true否则要用false
envelope.bodyOut = transport;
envelope.setOutputSoapObject(soapObject);// 设置请求参数
// new MarshalDate().register(envelope);
envelope.addMapping(nameSpace, "CarMaintenanceInfo", info.getClass());// 传对象时必须,参数namespace是webservice中指定的,
// claszz是自定义类的类型
try {
transport.call(soapAction, envelope);
// SoapObject sb = (SoapObject)envelope.bodyIn;//服务器返回的对象存在envelope的bodyIn中
Object obj = envelope.getResponse();// 直接将返回值强制转换为已知对象
Log.d("WebService", "返回结果:" + obj.toString());
}
catch (IOException e) {
e.printStackTrace();
}
catch (XmlPullParserException e) {
e.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
return true;
// 解析返回的结果
// return Boolean.parseBoolean(new AnalyzeUtil().analyze(response));
}
注意:传递date类型的时候其实可以使用Date而不是String。但是需要修改几个地方
1.CarMaintenanceInfo类中的getPropertyInfo(),将arg2.type = PropertyInfo.STRING_CLASS修改为MarshalDate.DATE_CLASS;
2. 在请求方法中的 envelope.setOutputSoapObject(soapObject);下加上 new MarshalDate().register(envelope);
虽然可以使用Date,但是传到服务器上的时间与本地时间有时差问题。
当Android 调用webservice,请求参数中有日期,guid,double时,将这些类型在添加对象前转换为字符串即可。
[java] view plain
// 构造request
SoapObject request = new SoapObject(PublishInfo.NAMESPACE, "GetCarListByRegion");
request.addProperty("leftTopLat", String.valueOf(leftTopLat));
request.addProperty("leftTopLng", String.valueOf(leftTopLng));
request.addProperty("rightBottomLat", String.valueOf(rightBottomLat));
request.addProperty("rightBottomLng", String.valueOf(rightBottomLng));
当需要传递一个服务器对象参数时.
[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetLicenseDetails xmlns="http://tempuri.org/">
<companyId>guid</companyId>
<licenseNos>
<string>string</string>
<string>string</string>
</licenseNos>
<pageOptions>
<page>int</page>
<rows>int</rows>
<total>int</total>
<sort>string</sort>
<order>string</order>
<skip>int</skip>
<Remark>string</Remark>
</pageOptions>
</GetLicenseDetails>
</soap:Body>
</soap:Envelope>
[java] view plain
public ListPageResult<LicenseInfo> getLicenseDetails(String[] licenseNos, int page, int rows, int total) {
// 构造request
SoapObject request = new SoapObject(PublishInfo.NAMESPACE, "GetLicenseDetails");
// 许可证列表
SoapObject deviceObject = new SoapObject(PublishInfo.NAMESPACE, "GetLicenseDetails");
if (licenseNos != null && licenseNos.length > 0) {
for (int i = 0; i < licenseNos.length; i++) {
if (!"".equals(licenseNos[i])) {
deviceObject.addProperty("string", licenseNos[i]);
}
}
request.addProperty("licenseNos", deviceObject);
}
else {
request.addProperty("licenseNos", null);
}
// 分页数据
SoapObject optionObject = new SoapObject(PublishInfo.NAMESPACE, "PageOptions");
optionObject.addProperty("page", page);
optionObject.addProperty("rows", rows);
optionObject.addProperty("total", total);
optionObject.addProperty("sort", null);
optionObject.addProperty("order", "desc");
optionObject.addProperty("skip", 0);
optionObject.addProperty("Remark", null);
request.addProperty("pageOptions", optionObject);
// 获取response
Object response = sendRequest(context, request);
if (!mNetErrorHanlder.hasError(response)) { return ObjectAnalyze.getLicenseDetails(response); }
return null;
}
③ Android Intent传递对象为什么要序列化,序列化有那几种方式
我们都知道进行android 开发的时候,跳转到Activity和Fragment的时候,传递对象是通过Intent或者bundle 进行传递。当这个对象没有实现序列化的时候 当你通过Inetnt传递的时候会报红,系统会提示你将这个对象实现序列化。
1.先了解一下 什么是序列化。通过对《Android 开发艺术探索》可以知道序列化是将一个对象转化成可存储可传输的状态,序列化后的对象可以在网络上传输,也可以存储到本地。
2.回到我们的主题,那为什么要序凳春列化呢?<大致有三个原因>
则橡 a.永久性保存对象,保存对象的字节序列到本地文件中
b.对象可以在网络中传输
c.对象可以在IPC之间传递
3.序列化有那几种方式呢<有两种方式>
android自定义对象可序列化有两个选择一个是Serializable和Parcelable
4.它们之间有什么区别?
a.在使用内存的时候Parcelable比Serializable的性能高。
b.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
c.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。
d.实现Serializable很简单 因为Serializable是一个空接口 所以只要在在实体类中实现这个接孙粗旁口即可 Parcelable就稍微复杂了一点了
这里有实现Parcelable 这个接口的列子 blog.csdn.net/jaycee110905/article/details/21517853
④ Android Activity之间传递对象及对象数组
假设对象为People类,包含信息姓名和年龄:
方法一:Serializable
必须条件:类实现了Serializable接口
传递对象:
传递端:
接收端:
传递对象空兆判数组:
传递端:
接收端:
方法二:Parcelable
必须条件:类实现了Parcelable接口
传递对象:
传递端:
接收端:
传递对象数组:
传递端:
接收端:
可以发现在Parcelable中需实现public int describeContents()、 publicvoid writeToParcel(Parcel parcel, int arg1),还需要在添加一个静态成员变量CREATOR:public static final Parcelable.Creator CREATOR。
区别:
1.Serializable的实现,只需要implements Serializable即可。这只是给对象打了一个标记,系统会自动将其序列化。猜衡
2.Parcelabel的实现,不仅需要implements Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口。
3.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。4.Serializable在序列化的时候会产生斗改大量的临时变量,从而引起频繁的GC。
5.Parcelable不能使用在要将数据存储在磁盘上的情况,因为在外界有变化的情况下Parcelable不能很好的保证数据的持续性。