捆绑式解决方案:
在我的应用程序中,我创建了一个轻量级类,专门用于将其从手机发送到观看。由于代码在应用程序的移动和可穿戴部分之间共享,因此可以在两个设备上轻松打包和恢复,无需重复代码。它提供Bundle
类似机制,但使用DataMap
.
示例实现:
public class MyObject {
public final long itemId;
public final long sortOrder;
public final String priceString;
public MyObject(long itemId, long sortOrder, String priceString) {
this.itemId = itemId;
this.sortOrder = sortOrder;
this.priceString = priceString;
}
public MyObject(DataMap map) {
this(map.getLong("itemId"),
map.getLong("sortOrder"),
map.getString("priceString")
);
}
public DataMap putToDataMap(DataMap map) {
map.putLong("itemId", itemId);
map.putLong("sortOrder", sortOrder);
map.putString("priceString", priceString);
return map;
}
}
编写这样的类将让您考虑设备之间实际需要发送的内容以尽可能少地发送。当添加或删除任何字段时,它也不会中断(与下一个解决方案相反)。
回答您的 Parcelable 问题:
如果您不想编写新类并想重用现有代码,可以尝试使用下面的代码。它将让您只使用Parcelable
接口(无需实现Serializable
接口)。我没有在跨设备发送时对其进行测试,但它成功地发送到Parcelmarshall()
并unmarshall()
从 Parcel 发送字节数组并将其存储在DataMap
.
注意:我不确切知道 Google Play 服务是如何保存所有这些DataApi
数据的,但我担心在更新此类时可能会出现问题。
例如,该类将在 Android Wear 上更新,用户将启动应用程序,该应用程序将尝试从中读取当前数据DataApi
(使用此类的旧版本“序列化”)并尝试从中读取它,byte[]
就好像它是更新版本一样. 应该对这些问题进行测试,但我不认为它们DataApi
“仅仅因为”或者让在 Wear 上开发应用程序变得更加困难。
我强烈建议使用Bundle
-like 解决方案并且不要使用该Parcelable
解决方案。
使用它需要您自担风险。
import android.os.Parcel;
import android.os.Parcelable;
import com.google.android.gms.wearable.DataMap;
/**
* <p>Allows to put and get {@link Parcelable} objects into {@link DataMap}</p>
* <b>USAGE:</b>
* <p>
* <b>Store object in DataMap:</b><br/>
* DataMapParcelableUtils.putParcelable(dataMap, "KEY", myParcelableObject);
* </p><p>
* <b>Restore object from DataMap:</b><br/>
* myParcelableObject = DataMapParcelableUtils.getParcelable(dataMap, "KEY", MyParcelableObject.CREATOR);
* </p>
* I do <b>not recommend</b> to use this method - it may fail when the class that implements {@link Parcelable} would be updated. Use it at your own risk.
* @author Maciej Ciemięga
*/
public class DataMapParcelableUtils {
public static void putParcelable(DataMap dataMap, String key, Parcelable parcelable) {
final Parcel parcel = Parcel.obtain();
parcelable.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
dataMap.putByteArray(key, parcel.marshall());
parcel.recycle();
}
public static <T> T getParcelable(DataMap dataMap, String key, Parcelable.Creator<T> creator) {
final byte[] byteArray = dataMap.getByteArray(key);
final Parcel parcel = Parcel.obtain();
parcel.unmarshall(byteArray, 0, byteArray.length);
parcel.setDataPosition(0);
final T object = creator.createFromParcel(parcel);
parcel.recycle();
return object;
}
}
该代码也可在GitHub上找到。