从多个活动访问google plus客户端

我正在开发一个我已集成谷歌加上的应用程序。 到目前为止它工作正常,我能够检索用户配置文件。

但现在我想做以下事情:

1)我有两个活动signInActivityshareActivity

2)如果用户已使用signInActivity登录,则不应在shareActivity再次请求登录,而应直接共享内容。

3)如果用户未登录signInActivity并尝试使用shareActivity共享数据,则应该登录用户,然后仅共享数据。 在这种情况下,如果用户返回signInActivity则应用程序应显示“您已经签名”

简而言之,我希望用户登录在应用程序中是中心 ,这样如果它是alrady签名,它应该可以从任何活动访问。

我听说过访问令牌,但我不知道如何使用它,文档说它会在一小时内到期,这不是我想要的。

我如何制作中央谷歌加登录? 可能吗? 或者我需要在每个活动中validation用户?

在每项活动中管理单独的GoogleApiClient实例不会导致要求用户多次登录。

Google+登录(即GoogleApiClient)为设备上的Google帐户和Google Play服务核心服务提供了一个界面 – 它没有每个GoogleApiClient实例的状态。 因此,一旦设备帐户针对您的应用进行了身份validation,GoogleApiClient的新实例将访问相同的状态。 GoogleApiClient专门设计为访问由Google Play服务管理的中央状态的轻量级方式。

关于访问令牌,你很幸运! Google Play服务会为您处理所有令牌管理。 因此,虽然访问令牌只持续一小时,但正如您所说,如果您尝试使用PlusClient访问Google API且访问令牌已过期,Google Play服务将透明地为您请求新的访问令牌并完成调用。

有关详细信息,请查看此Google I / O演讲的第一部分:

http://www.youtube.com/watch?v=_KBHf1EODuk

0. TL; DR

对于不耐烦的编码器,可以在GitHub上find以下实现的工作版本。 这是另一个Stack Overflowpost上写的相同答案。

在许多不同的应用程序中多次重写登录活动代码后,简单(而不是那么优雅)的解决方案是将Google API客户端创建为Application类对象。 但是,由于连接状态会影响UX流程,因此我对此方法一直不满意。

将我们的问题仅减少到连接概念 ,我们可以考虑:

  1. 它隐藏了Google API客户端。
  2. 它有有限的状态。
  3. 它是(相当)独特的。
  4. 当前状态会影响应用程序的行为。

1.代理模式

由于Connection封装了GoogleApiClient ,它将实现ConnectionCallbacksOnConnectionFailedListener

 @Override public void onConnected(Bundle hint) { changeState(State.OPENED); } @Override public void onConnectionSuspended(int cause) { changeState(State.CLOSED); connect(); } @Override public void onConnectionFailed(ConnectionResult result) { if (currentState.equals(State.CLOSED) && result.hasResolution()) { changeState(State.CREATED); connectionResult = result; } else { connect(); } } 

活动可以通过connectdisconnectrevoke方法与Connection类进行通信,但它们的行为由当前状态决定。 状态机需要以下方法:

 protected void onSignIn() { if (!googleApiClient.isConnected() && !googleApiClient.isConnecting()) { googleApiClient.connect(); } } protected void onSignOut() { if (googleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(googleApiClient); googleApiClient.disconnect(); googleApiClient.connect(); changeState(State.CLOSED); } } protected void onSignUp() { Activity activity = activityWeakReference.get(); try { changeState(State.OPENING); connectionResult.startResolutionForResult(activity, REQUEST_CODE); } catch (IntentSender.SendIntentException e) { changeState(State.CREATED); googleApiClient.connect(); } } protected void onRevoke() { Plus.AccountApi.clearDefaultAccount(googleApiClient); Plus.AccountApi.revokeAccessAndDisconnect(googleApiClient); googleApiClient = googleApiClientBuilder.build(); googleApiClient.connect(); changeState(State.CLOSED); } 

2.国家格局

这是一种行为模式,允许对象在其内部状态发生变化时改变其行为。 GoF设计模式书描述了这种模式如何表示TCP连接(这也是我们的例子)。

来自状态机的状态应该是singleton ,并且在Java中最简单的方法是创建名为State Enum ,如下所示:

 public enum State { CREATED { @Override void connect(Connection connection) { connection.onSignUp(); } @Override void disconnect(Connection connection) { connection.onSignOut(); } }, OPENING {}, OPENED { @Override void disconnect(Connection connection) { connection.onSignOut(); } @Override void revoke(Connection connection) { connection.onRevoke(); } }, CLOSED { @Override void connect(Connection connection) { connection.onSignIn(); } }; void connect(Connection connection) {} void disconnect(Connection connection) {} void revoke(Connection connection) {} 

Connection类保存上下文,即当前状态,它定义Connection方法如何connectdisconnectrevoke将表现如下:

 public void connect() { currentState.connect(this); } public void disconnect() { currentState.disconnect(this); } public void revoke() { currentState.revoke(this); } private void changeState(State state) { currentState = state; setChanged(); notifyObservers(state); } 

3.单身模式

由于不需要重复重新创建此类,因此我们将其作为单例提供:

 public static Connection getInstance(Activity activity) { if (null == sConnection) { sConnection = new Connection(activity); } return sConnection; } public void onActivityResult(int result) { if (result == Activity.RESULT_OK) { changeState(State.CREATED); } else { changeState(State.CLOSED); } onSignIn(); } private Connection(Activity activity) { activityWeakReference = new WeakReference<>(activity); googleApiClientBuilder = new GoogleApiClient .Builder(activity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API, Plus.PlusOptions.builder().build()) .addScope(new Scope("email")); googleApiClient = googleApiClientBuilder.build(); currentState = State.CLOSED; } 

4.可观察的模式

Connection类扩展了Java Observable ,因此一个或多个活动可以观察状态更改:

 @Override protected void onCreate(Bundle bundle) { connection = Connection.getInstance(this); connection.addObserver(this); } @Override protected void onStart() { connection.connect(); } @Override protected void onDestroy() { connection.deleteObserver(this); connection.disconnect(); } @Override protected void onActivityResult(int request, int result, Intent data) { if (Connection.REQUEST_CODE == request) { connection.onActivityResult(result); } } @Override public void update(Observable observable, Object data) { if (observable != connection) { return; } // Your presentation logic goes here... } 

对于阅读此问题的任何人,您也可以查看Ian Barber的答案以及下面的答案,Lee回答,这解释了使用Google加登录和多项活动的三种主要方式,我发现这些方法非常有用。