如何在活动之间传递游戏中心数据?

5
好的,我正在为Android实现新的游戏中心,但有一个概念我不明白。
我有一个继承BaseGameActivity(https://developers.google.com/games/services/android/init)的类,它管理成就、排行榜、Google+登录等功能。我需要另一个类来访问游戏中心数据(解锁成就、排行榜等),但这个类没有从扩展BaseGameActivity类中调用。
它们如何进行通信?
结构如下(意思是“->”启动其他活动):
A(扩展BaseGameActivity)-> B -> C(需要与A进行游戏中心通信)
我已经阅读了谷歌的示例(TypeANumber),但它使用监听器进行通信,当您需要与要通信的类是您正在启动的类时,这很容易,但在我的结构中并不容易。
有任何想法吗?
谢谢。

还没有看过文档,但是你能否将所需数据作为“Intent”的Extra放入其中? - edthethird
好的,你可以尝试的一件事情是,不要继承BaseGameActivity,而是看看他们是如何实现的,然后将GamesClient放在应用程序的根级别。看起来对于认证部分,GamesClient需要一个活动,但我相信你可以很容易地从你的初始活动初始化全局应用程序的游戏客户端。 - dmason82
4个回答

5
我认为你有三种选择:
1. 为每个需要它的Activity创建一个GamesClient,但是你必须为每个Activity调用connect()方法,这需要时间。在第一次连接之后,其他连接会更快(几百毫秒)。
2. 创建自己的Application类,并将其用作GamesClient.Builder的上下文,并将你的GamesClient对象存储在自己的Application类中。我已经测试过了,它可以正常工作。现在,我知道这样做是不被鼓励的(因为它违反了Android的理念),但似乎很多人更喜欢创建自己的应用程序类并将数据存储在其中,而不是将数据捆绑并从一个Activity传递到另一个Activity。它的主要优点是你不必修改太多东西就可以使其在你的情况下工作(也是我的情况)。
3. 使用Fragment类代替Activity类,并使用一个拥有GamesClient对象的主Activity(在这种情况下,你的C类将能够与A类通信)。就像你提到的例子一样,只有一个Activity继承自Google示例的BaseGameActivity(其中包含GamesClient实例),其余都是Fragment类(每个Fragment都是一个屏幕)。

1
最直接的方式在游戏中多个屏幕之间共享GamesClient是使用Fragments,这在TypeANumber示例中有所体现。
话虽如此,如果您仍然想要有多个Activities,则每个Activity必须管理其自己的GamesClient对象,因为GamesClient绑定到特定的Activity。因此,如果您正在使用示例代码,则每个Activity都必须从BaseGameActivity派生,并且它们每个人都会得到onSignInSucceeded()。在每个Activity中,您可以使用getGamesClient()获取该Activity的GamesClient对象。

谢谢Bruno,这就是我最终做的。也许下次我会尝试实现Fragments。 - jl1990
1
很不幸,将多个Fragment与单个Activity集成在一起并不总是可行的。同样地,扩展基类也不是一个理想的解决方案;第三方库似乎都默认你可以简单地继承它们的基类,但是Java只支持单一继承,而我可能需要同时使用不同的库。我真的希望有一个应用程序范围的生命周期来处理这些情况。 - Mirko N.

0
如何将需要共享的所有数据封装到单例对象中,例如:
class SharedData {
    public String aString;
    public double aDouble;
    // etc
    public static SharedData globalInstance = new SharedData();
}

然后你的应用程序中的所有部分都可以通过SharedData.globalInstance进行访问。


单例模式是一种反模式。我不建议使用它。如果您要使用此方法,最好使用应用程序对象而不是定义共享数据单例。 - 0909EM
1
@0909EM,我不确定您所说的反模式是什么意思?甚至应用程序对象的文档也提到了singleton。无论如何,我同意使用应用程序对象可以实现相同的目标。 - Stochastically
抱歉让你去看维基百科(它可能是最好的或最糟糕的资源之一)http://en.m.wikipedia.org/wiki/Singleton_pattern 我使用单例模式的经历有好有坏,有时非常有用,但有时很难测试...只是想指出单例有时被认为是反模式。 - 0909EM

0

只是想法……我还没有看过代码,所以请带着一点保留来处理这个问题。

你能否将其封装在一个可包裹/可序列化的对象中,然后在需要它的每个活动中使用set/getparcelable?我建议向下传递一个接口,但不确定没有查看代码情况下该有多容易。

另外,你能否将游戏客户端逻辑封装在一个服务中,以便你可以从每个活动中与之交互?


不,它既不是Serializable也不是Parcelable。我想要实现的是只登录一次,然后尝试将数据发送到我登录的活动中。 唯一的解决方案是使用片段。 - jl1990

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接