我在我的应用中使用了Google+登录功能。登录功能位于我的LoginActivity
中,登出功能是从另一个活动(包含碎片的活动)调用的。为了能够调用logout方法,包含Fragments的Activity扩展了Login Activity(否则应用程序崩溃)。这些方法在登录活动中:
// Initializing google plus api client (from onCreate method of Login Activity)
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN).build();
//Called when a connection is successful
public void onConnected(Bundle arg0) {
mSignInClicked = false;
Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
//Get user's information
getProfileInformation();
Intent intent = new Intent(getApplicationContext(), UtilityActivity.class);
startActivity(intent);
}
当我运行应用程序时,Toast永远不会被解雇。当我评论出吐司并再次运行应用程序时,没有任何小部件响应。我认为该应用程序保持onConnected
状态?
我不知道为什么会发生这种情况,但我怀疑它是因为我调用onCreate
方法或onConnected
方法两次?
注销的调用是通过包含像这样的片段的Activity的onOptionsItemsSelected
方法进行的:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.action_settings:
Toast.makeText(getApplicationContext(), "Settings selected", Toast.LENGTH_LONG).show();
return true;
case R.id.action_logout:
signOutFromGooglePlus();
return true;
case R.id.action_revoke_access:
revokeGplusAccess();
return true;
}
单击登录按钮时调用的方法:
private void signInWithGooglePlus() {
if (!mGoogleApiClient.isConnecting()) {
mSignInClicked = true;
resolveSignInError();
}
}
答案 0 :(得分:0)
您提到问题发生在UtilityActivity中,由LoginActivity在onConnect()中启动。
您可能遇到的问题(没有看到UtilityActivity中的代码)是UtilityActivity没有从LoginActivity引用连接的GooogleApiClient。因此,虽然您在LoginActivity中具有有效连接,但您不在UtilityActivity中。请记住,扩展LoginActivity并不意味着您共享其字段。这更像是无需复制/粘贴的共享代码。
有几个选项可供选择 - 在启动UtilityActivity的Intent中传递mGoogleApiClient的副本,使控制登录/注销的活动成为您所有其他活动可以使用的服务,仅传递UtilityActivity所需的信息启动时的Intent,让每个Activity直接管理他们的GoogleApiClient连接...