【问题标题】:passing the GoogleApiClient obj from one activity to another将 GoogleApiClient obj 从一个活动传递到另一个活动
【发布时间】:2014-09-21 18:58:40
【问题描述】:

我希望能够在创建 GoogleApiClient obj 的活动(主要活动)之外的其他活动中更新我的排行榜分数。

最好的方法是什么?

以正确的方式使 obj 可打包吗?如果是这样,如果该类是库的一部分,你怎么能做到这一点。

你能把 obj 设为静态吗?安全吗?

任何关于如何实现这一点的建议都会很棒。

【问题讨论】:

    标签: android android-activity google-play-services


    【解决方案1】:

    您可以使用 Application 类,这是一个面向 android 的单例模式类,它可以是您的 ApiClient 调用的基类。

    这里是API 文档的链接,这里有一些examples 以及为什么使用Application over Singleton 的论据。

    【讨论】:

    • 这听起来我几乎是通过使用 basegameutil 来做到这一点的
    【解决方案2】:

    好的,我想我会回答我自己的问题,因为我找到了一种目前适合我的方法。 其中很多来自另一个已回答的问题here

    此方法使用 basegameutil,因此从链接中 Lee 的回答中,我可以让我的两个活动都扩展 BaseGameActivity 并添加所需的方法。

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

    mGoogleApiClient = getApiClient();
    

    我现在可以在我的第二个活动中传递它并按照我的意愿调用方法。

    正如 Lee States 在他的回答中所说,您可以拥有多个 google api 客户端实例,并且仍然不会被要求为每个实例登录,因为它知道您已经登录。

    【讨论】:

      【解决方案3】:

      我真正的考验是: 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 作为 Singleton 基类的参数调用 getInstance。

      • 第 3 步:在您想要传递 GoogleApiClient 对象的另一个服务/活动中,只需调用 Singleton 基类的 getInstance(null),然后调用 get_GoogleApiClient 即可获取所需的 GoogleApiClient 对象。

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

      【讨论】:

        【解决方案4】:

        如果您需要不断连接到 GoogleApiClient,那么我可能会创建一个单例类来处理 GoogleApiClient 调用 (http://en.wikipedia.org/wiki/Singleton_pattern) 或创建一个在整个应用生命周期中运行的后台服务 (https://developer.android.com/training/best-background.html)。

        From the developer documentation:

        GoogleApiClient 与多种静态方法一起使用。一些 这些方法需要连接 GoogleApiClient,有些会 在连接 GoogleApiClient 之前排队呼叫;检查具体 API 文档以确定您是否需要连接。

        如果您不需要立即发送数据,GoogleApiClient 会将要发送的数据排入队列,然后在主 Activity 中发送。

        【讨论】:

        • 我想立即更新排行榜。我也在使用我的主要活动扩展的 basegamesutil。
        • 我想只是调用 Games.Leaderboards.submitScore(getApiClient(), LEADERBOARD_ID, 1337);如果您已连接,则应发布到排行榜。
        • 可以,但我对如何获取 getApiClient() 感到困惑,因为它不在我尝试提交分数的活动中。我在这里遗漏了什么明显的东西吗?
        • @Rob85 看看这个问题以及相关的问题,我认为它们会有用。 stackoverflow.com/questions/16827839/…
        • @Ogen 感谢我刚刚发现了这个问题并正在考虑它,但看起来这是最简单的方法,我不确定它是否最干净。不过还是谢谢
        猜你喜欢
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 2017-12-10
        • 2012-07-05
        • 2015-01-14
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多