Java 如果我使用tbmp骨架,但tbmp骨架不是主要活动,我应该如何正确接收基于回合的比赛更新?

Java 如果我使用tbmp骨架,但tbmp骨架不是主要活动,我应该如何正确接收基于回合的比赛更新?,java,android,android-intent,Java,Android,Android Intent,我试图使用tbmp骨架,但我不将其用作主要活动。除了在测试期间,我尝试接受邀请并进入下一轮屏幕执行第1轮(第二轮)外,其他一切似乎都正常。在onActivityResult(在第二个活动中,我以一个意图开始)中,行: TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH); 在解组TurnBasedMatchEntity时触发BadParcelableException:ClassNo

我试图使用tbmp骨架,但我不将其用作主要活动。除了在测试期间,我尝试接受邀请并进入下一轮屏幕执行第1轮(第二轮)外,其他一切似乎都正常。在onActivityResult(在第二个活动中,我以一个意图开始)中,行:

TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH);
在解组TurnBasedMatchEntity时触发BadParcelableException:ClassNotFoundException

之前在网站上提出的关于“BadparcelableException on passing TurnBasedMatch in intent”的问题没有提供任何有用的线索。我已经在以alphas形式发布的代码中尝试了二十多种变体,并进行了测试。我得出的结论是,问题在于我没有将tbmp骨架设置为主要活动。有没有办法解决这个问题,不需要我在tbmp中尝试将我的正常主要活动与骨架活动结合起来?否则,tbmp作为一项辅助活动似乎效果不错。它会自动登录到google+,我可以“开始比赛”、“检查游戏”、“注销”并开始一个自动游戏。由“开始匹配”创建的游戏允许发令者添加到当前字符串中,并单击“完成”可在“检查游戏”中看到游戏结果。选择一个对手(我的另一个gmail测试帐户)是有效的。另一个测试gmail帐户可以在check games中查看游戏并接受邀请。如果另一个gmail游戏进程处于活动状态并已登录,那么当第一个游戏进程发送邀请时,我会看到第二个游戏进程上的祝酒词,该祝酒词会发出收到邀请的通知。但是,如果在onStartMatchClicked中使用GetSelectOponentInstant,则无法进入第1关。用createMatch替换GetSelectOponentIntent似乎会导致本质上的自动匹配

如果我在第一个测试帐户中使用自动匹配来开始游戏,然后在第二个测试帐户中使用自动匹配,那么在第二个帐户中,我确实进入了第1回合,但是同样的问题再次出现,因为第一个帐户永远看不到或无法移动第2回合

这个网站上还有4个关于这个问题的问题。 “如何从Google Play Services通知中检测意图”、“如何确定从Google Play基于回合的通知中选择的匹配”、“TBMP框架:为什么在物理设备上未调用onTurnBasedMatchReceived和onInvitationReceived”,以及(外围设备)“TBMP框架如何覆盖通知事件”。“我的帐户”已启用“同步”,而“谷歌游戏”已启用“通知”。向意图中添加另一个额外内容并搜索它似乎不起作用。打开和关闭RegisterMachupDataListener和registerInvitationListener不会产生有益的结果。我认为,当您将tbmp框架转换为非主要活动时,了解tbmp框架需要做哪些更改会很有帮助。在我看来,这是Java代码的一个常见问题,您通常无法将代码块从一个地方移动到另一个地方,因为如果您这样做,代码块就会断开


我的备选方案是:1)在一个纯alpha的google play帐户中设置tbmp skeleton,看看当SkeletonActivity是主要活动时问题是否会复制;2)将SkeletonActivity移植到我的正常主要活动上,3)删除tbmp skeleton,尝试使用github或programcreek中的另一个示例,如果您通过通知获得邀请/匹配更新,只是没有调用您的侦听器,请确保您记得注册侦听器!!!我花了太长时间在这上面,只是忘记了注册听众(肯定我太开心了)


不要使用下面给出的android github示例中的接受邀请代码:

TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH);
相反,请使用以下方法获取匹配值:

public Task<TurnBasedMatch> acceptInvitation (String invitationId) 
公共任务接受邀请(字符串邀请ID)
&使用事件侦听器获取匹配项,然后依次进行

如果未能使用上述方法,则在发布版本崩溃时调试应用程序可以正常工作,并在play store中发布后返回相同的异常


注册已折旧方法的侦听器不是强制性的,而是注册回调以获取邀请Id。

将此行添加到proguard配置中:

 -keep class  com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchEntity
请考虑为邀请添加此项:

 -keep class com.google.android.gms.games.multiplayer.InvitationEntity

我尝试将代码从SkeletonActivity移动到我的主要活动。生成的应用程序似乎在转换到我的旧主活动之前产生相同的结果,即所有相同的行为和BadParcelableException错误结果仍在发生。我想我错了,因为我把tbmp骨架放到了一个非主要活动中。我尝试发布此应用程序的游戏服务定义。在这篇文章发表之前,我依赖于alpha测试。由于我可以看到的发布,结果没有实际变化(最初显示的游戏状态字符串发生了变化)。此后我决定使用实时示例ButtonClicker,而不是基于回合的示例。我发现用这种方式完成我的项目是可能的。我不会把它作为对原始问题的回答,因为它不是。不过,这是一个可行的解决办法。
 -keep class com.google.android.gms.games.multiplayer.InvitationEntity