将GoogleApiClient对象从一个活动传递到另一个活动

15
我希望能在除了创建GoogleApiClient对象的主Activity之外的其他Activity中更新排行榜分数。
最好的方法是什么?
将该对象作为可Parcelable对象是否正确?如果是,那么如果该类是库的一部分,该如何实现呢?
您能使该对象为静态吗?这样做是否安全?
任何关于如何实现这一目标的建议都将是非常有用的。
4个回答

4

我的真正问题是: 1. 不能将GoogleApiClient作为Intent参数传递给另一个服务或活动。 2. 使用Singleton类来解决它,如下所示: + 步骤1:创建包含GoogleApiClient对象作为数据成员的Singleton类。请按照以下方式执行:

import com.google.android.gms.common.api.GoogleApiClient;

public class MyGoogleApiClient_Singleton {
    private static final String TAG = "MyGoogleApiClient_Singleton";
    private static MyGoogleApiClient_Singleton instance = null;

    private static GoogleApiClient mGoogleApiClient = null;

    protected MyGoogleApiClient_Singleton() {

    }

    public static MyGoogleApiClient_Singleton getInstance(GoogleApiClient aGoogleApiClient) {
        if(instance == null) {
            instance = new MyGoogleApiClient_Singleton();
            if (mGoogleApiClient == null)
                mGoogleApiClient = aGoogleApiClient;
        }
        return instance;
    }

    public GoogleApiClient get_GoogleApiClient(){
        return mGoogleApiClient;
    }
}   
  • 步骤2:在主Activity类中初始化一个GoogleApiClient对象,然后使用mGoogleApiClient作为单例基类的参数调用getInstance方法。

  • 步骤3:在想要传递GoogleApiClient对象的另一个服务/Activity中,只需调用Singleton基类的getInstance(null)方法,并调用get_GoogleApiClient方法获取所需的GoogleApiClient对象。

如果您有任何问题,请联系我thienpham2008@gmail.com。


4
你可以使用Application类,这是一个面向Android的单例模式类,它可以作为ApiClient调用的基类。
这里是API文档的链接,以及一些示例和为什么使用Application而不是Singleton的参数。

这听起来我基本上是通过使用basegameutil来完成的。 - Rob85

4

我想回答自己的问题,因为我找到了一种适合我的方法。这与另一个回答的问题有关,可以在这里找到。

这种方法使用了basegameutil,所以我可以像Lee在链接中的答案一样,让我的两个活动都继承BaseGameActivity并添加所需的方法。

然后,在我的第二个活动中创建一个新的GoogleApiClient实例,然后像这样获取api客户端:

mGoogleApiClient = getApiClient();

我现在可以将这些方法传递到我的第二个活动并自由调用。

正如李先生在他的回答中所述,您可以拥有多个Google API客户端实例,并且仍然不需要为每个实例登录,因为它知道您已经登录。


3
如果您需要不断连接到GoogleApiClient,那么最好创建一个单例类来处理GoogleApiClient的调用(http://en.wikipedia.org/wiki/Singleton_pattern)或者创建一个后台服务,在整个应用程序生命周期中运行(https://developer.android.com/training/best-background.html)。
根据开发者文档
GoogleApiClient与各种静态方法一起使用。其中一些方法要求连接GoogleApiClient,一些方法会在连接GoogleApiClient之前排队调用;请检查特定的API文档以确定是否需要连接。
如果您不需要立即发送数据,则GoogleApiClient将把数据排队等待发送,并在主Activity中发送。

我希望排行榜能够立即更新。我还使用了basegamesutil,它是我的主活动扩展。 - Rob85
如果您已连接,我认为只需调用 Games.Leaderboards.submitScore(getApiClient(), LEADERBOARD_ID, 1337); 就可以将分数提交到排行榜。 - skipper3k
这可以做到,但我对如何获得 getApiClient()Feeling困惑,因为它不在我正在尝试提交分数的Activity中。我是否遗漏了明显的东西? - Rob85
2
@Rob85 看看这个问题以及相关的问题,我认为它们会很有用。https://dev59.com/x2Qn5IYBdhLWcg3wcWzM - Ogen
1
@Ogen 谢谢你,我刚刚发现了这个问题并正在考虑,但看起来这是最简单的解决方法,是否最干净我还不确定。但无论如何还是谢谢。 - Rob85

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