Android 从AccountManager中删除帐户不会';t将用户发送到AccountAuthenticator活动
我有一个使用AccountManager和自定义AccountAuthenticator注册用户的应用程序 我需要实现Android 从AccountManager中删除帐户不会';t将用户发送到AccountAuthenticator活动,android,authentication,android-service,accountmanager,android-authenticator,Android,Authentication,Android Service,Accountmanager,Android Authenticator,我有一个使用AccountManager和自定义AccountAuthenticator注册用户的应用程序 我需要实现注销功能 当用户单击注销按钮时,他们的帐户被成功删除,但活动保持不变,用户不会被重定向到AccountAuthenticator活动,尽管如果我关闭应用程序并再次打开它,它将显示身份验证屏幕(即,帐户实际上已被删除) 我的问题: 我必须自己执行重定向(使用finish();startActivity(…);)还是验证器和AccountManager应该为我处理它(因为我认为如果它
注销
功能
当用户单击注销
按钮时,他们的帐户被成功删除,但活动保持不变,用户不会被重定向到AccountAuthenticator活动
,尽管如果我关闭应用程序并再次打开它,它将显示身份验证屏幕(即,帐户实际上已被删除)
我的问题:
我必须自己执行重定向(使用finish();startActivity(…);
)还是验证器和AccountManager应该为我处理它(因为我认为如果它被声明为服务,它应该)
也许我必须实现某种帐户删除侦听器 无论如何,以下是我在
MainActivity
中删除帐户的方法:
private void performLogout() {
Account[] accounts = accountManager.getAccountsByType(AccountGeneral.ACCOUNT_TYPE);
if (accounts.length != 0) {
accountManager.clearPassword(accounts[0]);
accountManager.invalidateAuthToken(AccountGeneral.ACCOUNT_TYPE,
accountManager.getAuthToken(accounts[0], AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, null, true,
accountManagerFuture -> {
try {
Log.d("invalidateAuthToken", accountManagerFuture.getResult().toString());
} catch (android.accounts.OperationCanceledException | AuthenticatorException | IOException e) {
e.printStackTrace();
}
}, null).toString());
if (Build.VERSION.SDK_INT < 23) { // use deprecated method
accountManager.removeAccount(accounts[0], accountManagerFuture -> {
try {
if (accountManagerFuture.getResult()) {
Log.d("Deprecated ACCOUNT REMOVAL", "ACCOUNT REMOVED");
}
} catch (android.accounts.OperationCanceledException | IOException | AuthenticatorException e) {
e.printStackTrace();
}
}, null);
} else {
accountManager.removeAccount(accounts[0], this, accountManagerFuture -> {
try {
if (accountManagerFuture.getResult() != null) {
Log.d("ACCOUNT REMOVAL", "ACCOUNT REMOVED");
}
} catch (android.accounts.OperationCanceledException | AuthenticatorException | IOException e) {
e.printStackTrace();
}
}, null);
}
}
}
在我的清单中,我以以下方式声明了服务:
<service
android:name=".authenticator.DiscountyAuthenticationService"
android:process=":auth">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
</service>
那么,我是否必须手动重定向用户,或者我需要改进代码中的某些内容,使AccountManager为我处理重定向?删除帐户时,AccountManager不会启动其他帐户设置。如果您想要这种行为,您需要自己实现它 然而,我不建议这样实施。如果您单击“注销”,您不希望再次直接重定向到登录屏幕 相反,我会显示一条类似“成功注销”的成功消息,其中有两个按钮,一个表示“关闭”并关闭应用程序,另一个表示“再次登录”,将用户再次带到登录屏幕。这对用户更友好,伊姆霍 无论如何,要回答您的问题:如果您想自动进入登录屏幕,我会看到以下选项:
getAccountRemovalAllowed(…)
中允许returntrue
),因此在大多数情况下,假设删除成功应该是安全的。验证器必须处理帐户已经存在的情况,因为用户可以随时启动帐户设置accountManagerFuture.getResult()
,然后像在#1中一样启动帐户设置,前提是它返回成功还要注意,代码似乎在主线程中调用了
accountManagerFuture.getResult()
,这不是一个好主意,因为它可能会阻塞。的文档明确指出这是不允许的。即使您在AccountManagerCallback
回调中调用它,并且您可能认为调用它是安全的,我也不会依赖它,而是确保它在后台线程中执行。如果您不让用户确认删除,您可能应该打电话。删除帐户时,AccountManager不会启动另一个帐户设置。如果您想要这种行为,您需要自己实现它
然而,我不建议这样实施。如果您单击“注销”,您不希望再次直接重定向到登录屏幕
相反,我会显示一条类似“成功注销”的成功消息,其中有两个按钮,一个表示“关闭”并关闭应用程序,另一个表示“再次登录”,将用户再次带到登录屏幕。这对用户更友好,伊姆霍
无论如何,要回答您的问题:如果您想自动进入登录屏幕,我会看到以下选项:
getAccountRemovalAllowed(…)
中允许returntrue
),因此在大多数情况下,假设删除成功应该是安全的。验证器必须处理帐户已经存在的情况,因为用户可以随时启动帐户设置accountManagerFuture.getResult()
,然后像在#1中一样启动帐户设置,前提是它返回成功accountManagerFuture.getResult()
,这不是一个好主意,因为它可能会阻塞。的文档明确指出这是不允许的。即使你在AccountMa中调用它
<service
android:name=".authenticator.DiscountyAuthenticationService"
android:process=":auth">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
</service>