Android AccountManager帐号管理(二)

Android AccountManager 帐号管理(一)分享了如何将自己的帐号体系注册到系统服务AccountManagerService,统一由AccountManager来管理,这仅是自己的一点理解;但开发者对接的工作远不止如此,还有用户登录完成后如何将帐号添加到系统数据库中等等,AccountManager都有提供相对应的接口

在说接口之前,先看一下AccountManager会用到的两个接口类

一个是android.accounts.AccountManagerFuture

AccountManagerFuture类似于java的Future,提供了对AccountManager任务的执行进行取消,查询是否已经被取消,是否完成以及获取执行结果,通过getResult方法获取执行结果,该方法会阻塞直到任务返回结果

public interface AccountManager<V> {
/**取消任务的执行
如果任务已经完成/已经取消/不能被取消,则返回false
*/
boolean cancel(boolean mayInterruptIfRunning);
/**任务是否被取消
如果任务在完成之前被取消,则返回true
*/
boolean isCancelled();
/**任务是否完成
*/
boolean isDone();
/**获取任务的执行结果
这个接口可能会阻塞当前线程,直到任务完成/任务被cancel,故不要在主线调用此接口
*/
V getResult() throws OperationCanceledException, IOException, AuthenticatorException;
/**同上
参数规定了等待的时间timeout,如果超时,则会直接被cancel
*/
V getResult(long timeout, TimeUnit unit) throws OperationCanceledException, IOException, AuthenticatorException;
}

另一个是android.accounts.AccountManagerCallback

AccountManagerCallback,即AccountManager接口的回调,可在主线程执行

public interface AccountManagerCallback<V> {
   void run(AccountManagerFuture<V> future);
}

接下来分享一点自己对AccountManager提供的接口的理解,接口协议是由IAccountManager定义的

1. 获取AccountManager实例:

/**
获取AccountManager实例
备注:context最好传递application context,避免可能的不必要的内存泄漏
*/
public static AccountManager get(Context context);

2. 针对于注册帐号的authenticator app,需了解以下接口

下面这些即将列出的方法主要是for authenticator app,其他需要app主要是调用authToken相关方法
所以下面下列方法的调用是有权限求的:调用下面接口的app,要与对应帐号的authenticator app签名一致
还有一点:下面方法均可在主线程调用

/**
将一个帐号直接存储到AccountManager
*/
public boolean addAccountExplicitly(Account account, String password, Bundle userdata) 
/**
获取account的password(不一定是真实的用户密码,看authenticator app的存储)
*/
public String getPassword(final Account account);
/**
重置该account的password
注意:调用这个方法会清除该账号所有authToken在AccountManager中的缓存
*/
public void setPassword(final Account account, final String password) ;
/**
清除account的password
注意: 调用这个方法会清除该账号的password及authToken在AccountManager中的缓存
*/
public void clearPassword(final Account account) ;
/**
将account对应key-value存储在AccountManager中
*/
public void setUserData(final Account account, final String key, final String value);
/**
获取和该帐号相关的对应key值的value
*/
public String getUserData(final Account account, final String key);
/**
从AccountManager中删除account,由authenticator app决定是否可以删除该帐号
注意:这个方法可以在主线程调用,但是返回的AccountManagerFuture不能在主线程中使用
*/
public AccountManagerFuture<Bundle> removeAccount(final Account account, final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);
/**
直接从AccountManager数据库中删除account
*/
public boolean removeAccountExplicitly(Account account);

3. 下面接口供需要使用帐号服务的apps调用,当然authenticator app也可调用

/**
获取和该帐号相关的对应key值的value
备注:这个方法可在主线程调用
权限要求:和注册account的authenticator app签名一致
*/
public String getUserData(final Account account, final String key);
/**
获取当前注册到AccountManager中的所有authenticator app的属性(即在authenticator xml中定义的account属性,再加上authenticator app的包名)
备注:这个方法可在主线程调用
*/
public AuthenticatorDescription[] getAuthenticatorTypes();
/**
获取当前存储到AccountManager的所有帐号列表,和getAccountsByType(null)相同
备注:这个方法可在主线程调用
权限要求:需要GET_ACCOUNTS的权限(这个权限在android 6.0及以上是运行时权限,需要动态申请)
*/
public Account[] getAccounts() ;

public Account[] getAccountsByTypeForPackage(String type, String packageName) ;
/**
获取特定account type
备注:这个方法可在主线程调用
权限要求:需要GET_ACCOUNTS的权限(这个权限在android 6.0及以上是运行时权限,需要动态申请)
*/
public Account[] getAccountsByType(String type);

/**
删除存储AccountManager中此账号类型对应的authToken缓存,应用必须调用这个方法将缓存的authToken置为过期,否则getAuthToken获取到的一直是缓存的token
备注:这个方法可以在主线程中调用
*/
public void invalidateAuthToken(final String accountType, final String authToken) ;
/**
获取AccountManager缓存的某个账号对应authTokenType的authToken
如果缓存中没有对应authTokenType的token值,并不会重新生成,而是直接返回false
备注:这个方法可以在主线程中调用
权限要求:和注册account的authenticator app签名相同
*/
public String peekAuthToken(final Account account, final String authTokenType) ;
/**
将一个account对应autheTokenType的authToken缓存在AccountManager中
备注:这个方法可以在主线程中调用
权限要求:和注册account的authenticator app签名相同
*/
public void setAuthToken(Account account, final String authTokenType, final String authToken);
/**
同步获取account对应authTokenType的authToken
notifyAuthFailure,如果authenticator app返回出错,要不要弹通知提醒
备注:这个方法可以可能涉及到网络请求,不要在主线程调用
权限要求:和注册account的authenticator app签名相同
*/
public String blockingGetAuthToken(Account account, String authTokenType, boolean notifyAuthFailure);
/**
权限要求:和注册account的authenticator app签名相同
*/
public AccountManagerFuture<Bundle> getAuthToken(final Account account, final String authTokenType, final Bundle options, final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);
/**
权限要求:和注册account的authenticator app签名相同
*/
public AccountManagerFuture<Bundle> getAuthToken(final Account account, final String authTokenType, final Bundle options, final boolean notifyAuthFailure, AccountManagerCallback<Bundle> callback, Handler handler);
/**
要求用户添加某个特定accountType的帐号,如没有则会引导注册(authenticator app自己的处理)
注意:调用这个接口会调起authenticator app帐号登录的页面。传的activity参数就是用来启动这个intent的:如果传的activity参数不为null,则AccountManager会自动帮你start 登录的intent,否则你自己调用future.getResult(),返回的结果中会有AccountManager#KEY_INTENT对应的帐号登录页面的intent
*/
public AccountManagerFuture<Bundle> addAccount(final String accountType, final String authTokenType, final String[] requiredFeatures, final Bundle addAccountOptions, final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler);
/**
认证用户的身份(一般是验证帐号的密码)
注意:验证的行为由authenticator app来定义,同addAccount会调起authenticator app认证的页面
*/
public AccountManagerFuture<Bundle> confirmCredentials(final Account account, final Bundle options, final Activity activity, final AccountManagerCallback<Bundle> callback, final Handler handler);

4. 除了以上接口外,还有一些获取帐号属性等接口

/**
获取当前注册到AccountManager中的所有authenticator app的属性(即在authenticator xml中定义的account属性,再加上authenticator app的包名)
备注:这个方法可在主线程调用
*/
public AuthenticatorDescription[] getAuthenticatorTypes();

猜你喜欢

转载自blog.csdn.net/dzkdxyx/article/details/78632945
今日推荐