我正在开发一款基于回合制多人游戏支持的游戏。要获取播放器当前游戏的列表,我使用GamesClient.loadTurnBasedMatches
方法。这工作正常,但当我尝试打开一个新的活动并传递匹配它崩溃。我用来启动新活动的代码是
private void openMatch(TurnBasedMatch match) {
Intent intent = new Intent(this, MultiPlayerGame.class);
intent.putExtra("match", match);
startActivity(intent);
}
但是在执行这段代码后我得到了这个错误:(它有限,所以我看不到整个包名)
02-03 21:28:02.880:E / AndroidRuntime(5513):java.lang.RuntimeException:无法启动活动ComponentInfo {com.mypackage.MultiPlayerGame}:android.os.BadParcelableException:Parcelable协议需要Parcelable。 com.google.android.gms.games.multiplayer.turnbased.a上的创建者对象名为CREATOR
它实际崩溃的行是:
match = getIntent().getExtras().getParcelable("match");
现在我不确定这是不是我的错,或者在play-services-lib中是否存在错误。或者它与proguard有关?顺便说一句,如果我使用内置的意图向用户展示他的游戏同样的方法。 (在onActivityResult中)
if (request == RC_LOOK_AT_MATCHES) {
TurnBasedMatch match = data.getParcelableExtra(GamesClient.EXTRA_TURN_BASED_MATCH);
if (match != null)
openMatch(match);
}
答案 0 :(得分:0)
您的TurnBasedMatch
必须实施Parcelable合同。请参阅examples here或here
答案 1 :(得分:0)
我设法通过仅将matchId发送到下一个活动来解决它。在该活动中,我使用GamesClient.getTurnBasedMatch
。可能是默认意图在背景中执行此操作但我不确定。
答案 2 :(得分:0)
尝试
intent.putExtra("match", new TurnBasedMatchEntity(match));
TurnBasedMatchEntity是一个实现TurnBasedMatch的类,支持作为Parcelable发送。您可以像以前一样检索它。
TurnBasedMatch match = getIntent().getExtras().getParcelable("match");
答案 3 :(得分:0)
TurnBasedMatch
(及其所有实现)实现Freezable<>
,其中freeze()
方法。调用它将为您提供适合序列化的实例。
我怀疑(但尚未确认)对freeze()
的调用只会返回TurnBasedMatchEntity
个对象。这个解决方案的好处是你不必关心;所有你必须关心的是界面中定义的内容。
作为旁注,TurnBasedMatch
界面扩展为Parcelable
,其中应该意味着每个实现都是可以分配的......但它似乎TurnBasedMatchRef
没有&# 39; t实际实现它(因此例外)。实现不应该违反这样的接口,但看起来就是这样。