今天我的应用程序有一个经典的登录屏幕(用户名和密码),这个类扩展了一个通用的"活动"。我的初始活动是登录(如果已经登录的用户重定向到主页)。
我的android清单:
<!-- Start Activity -->
<activity
android:name=".activity.LoginActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
现在我正在尝试部署Android的帐户管理器,阅读文档并实现。功能还可以。如果你输入Android帐户设置,就可以登录到应用程序并创建一个帐户。但我的问题是如何保持双向。
作为facebook,如果用户打开应用程序,它将登录并自动在AccountManager上创建一个帐户,并在设置中获取帐户。在我请求服务器上的用户验证和密码(使用排球)后,我应该如何知道要完成什么步骤?是否将数据返回给AccountManager或添加帐户?
经典登录,在服务器验证后使用"addAccountExplicitly"添加帐户:
private void finishLogin(final String email, final String authToken) {
Account account = new Account(email, AccountGeneral.ACCOUNT_TYPE);
boolean success = mAccountManager.addAccountExplicitly(account, "", null);
if (success) {
Log.d(TAG, "Account created");
mAccountManager.setAuthToken(account, mAuthTokenType, authToken);
} else {
Log.d(TAG, "Account creation failed. Look at previous logs to investigate");
}
}
并登录帐户设置:
Bundle data = new Bundle();
data.putString(AccountManager.KEY_ACCOUNT_NAME, email);
data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
data.putString(AccountManager.KEY_AUTHTOKEN, authToken);
data.putString(PARAM_USER_PASS, password);
final Intent intent = new Intent();
intent.putExtras(data);
final Account account = new Account(email, accountType);
if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
Log.d(TAG, " finishLogin > addAccountExplicitly");
// Creating the account on the device and setting the auth token we got
// (Not setting the auth token will cause another call to the server to authenticate the user)
mAccountManager.addAccountExplicitly(account, password, null);
mAccountManager.setAuthToken(account, mAuthTokenType, authToken);
} else {
Log.d(TAG, " finishLogin > setPassword");
mAccountManager.setPassword(account, password);
}
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
为了保持这两种方式,您不需要有两个活动和处理两个场景。只需集成所有登录过程,设置帐户数据并在您的帐户管理器包中显式添加帐户。(抛出设置-->添加帐户即可到达的)。
然后在您的应用程序中,您可以从AccountManager
类获得不同的选项。
您可以通过调用getAccountsByType()来检查是否已经有帐户。
您可以通过调用AddAccount()在应用程序中添加帐户。它将自动显示您从"设置"中访问的相同活动。它还具有返回所选帐户名和authToken的回调。
您也可以调用newChooseAccountIntent()。这是一个非常好的选项,因为如果没有帐户,此方法会自动显示登录活动,如果已经添加了帐户,则会将其显示为列表,用户可以选择一个帐户。