捆绑式解决方案:
在我的应用程序中,我创建了一个轻量级类,专门用于将其从手机发送到手表。由于代码在应用程序的移动和可穿戴部分之间共享,因此可以在两个设备上轻松打包和恢复,而无需重复代码。它提供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
界面)。我还没有在跨设备发送时测试过它,但它成功了marshall()
and unmarshall()
与 Parcel 之间的字节数组并将其存储在DataMap
.
NOTE:我不知道 Google Play 服务如何保存所有这些DataApi
数据,但我担心更新此类时可能会出现问题。
例如,该类将在 Android Wear 上更新,用户将启动应用程序,尝试从中读取当前数据DataApi
(这是使用此类的旧版本“序列化”的)并尝试从中读取它byte[]
就好像它是更新版本一样。这些担忧应该得到检验,但我不认为它们使DataApi
如此原始的“只是因为”或者让在 Wear 上开发应用程序变得更加困难。
我强烈推荐使用Bundle
类似的解决方案并且不使用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 https://gist.github.com/MaciejCiemiega/0cd67c442f2d03c2ddac.