类似捆绑的解决方案:
在我的应用程序中,我创建了一个轻量级类,专门用于将其从手机发送到观看。由于代码在应用程序的移动和可穿戴部分之间共享,因此可以在两个设备上轻松打包和恢复,而无需重复代码。它提供Bundle-like 机制,但使用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() 和 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 上找到。