从多个活动访问谷歌加客户端

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

但现在我想要做到以下几点:

1)我有两个活动signInActivityshareActivity

2)如果用户已经使用signInActivitylogin,那么它不应该再次请求shareActivitylogin,并应直接共享内容。

3)如果用户没有在signInActivity中signInActivity并尝试使用shareActivity共享数据,那么应用程序应该login用户,然后只共享数据。 在这种情况下,如果用户返回到signInActivity那么应用程序应该显示“您已经login”

简而言之,我希望用户login是在应用程序中的中央 ,以便如果它被签名,应该可以从任何活动访问。

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

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

Solutions Collecting From Web of "从多个活动访问谷歌加客户端"

在每个活动中pipe理一个单独的GoogleApiClient实例不会导致用户被要求多次login。

Google+login(例如,GoogleApiClient)为设备上的Google帐户和Google Play服务核心服务提供了一个界面 – 它没有每个GoogleApiClient实例的状态。 因此,一旦设备帐户已经为您的应用程序进行身份validation,新的GoogleApiClient实例将访问相同的状态。 GoogleApiClient专为轻松访问由Google Play服务pipe理的中央状态而devise。

你有幸获得令牌! Google Play服务为您处理所有令牌pipe理。 因此,虽然访问令牌只能持续一个小时,但如您所说,如果您尝试使用PlusClient访问Google API并且您的访问令牌已过期,那么Google Play服务会透明地为您请求新的访问令牌并完成调用。

看看这个Google I / O谈话的第一部分,了解更多细节:

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

TL; DR

对于急躁的编码器,可以在GitHub上find以下实现的工作版本。 这是写在另一个堆栈溢出post相同的答案。

在许多不同的应用程序中多次重写login活动代码之后,简单(而不是那么优雅)的解决scheme就是将Google API客户端创build为Application类对象。 但是,由于连接状态会影响用户体验stream量,所以我从来不喜欢这种方式。

将我们的问题仅仅归结为连接概念 ,我们可能会认为:

  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.状态模式

这是一种行为模式,允许对象在其内部状态改变时改变其行为。 GoFdevise模式书描述了如何通过这种模式来表示TCP连接(这也是我们的情况)。

来自状态机的状态应该是一个singleton ,在Java中最简单的做法是创build一个名为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的方法,以及我发现实际上非常有用的login和多个活动。