AccountManager简介

AccountManager帐号管理器,集中管理apps注册的不同类型的帐号。
不同类型的帐号服务会使用不同的帐号登录和鉴权方式,所以AccountManager为不同类型的帐号提供一个插件式authenticator模块,authenticators自己处理帐号登录/认证的具体细节,也可以自己存储帐号信息

简言之,AccountManager是一个面向应用程序开发的组件,它提供了一套对应于IAccountManager协议的应用程序接口;这组接口通过Binder机制与系统服务AccountManagerService进行通信,协作完成帐号相关的操作。同时,AccountManager接收authenticators提供的回调,以便在帐号操作完成之后向调用此帐号服务的业务返回对应的接口,同时触发这个业务对结果的处理。
- authenticators 即注册帐号服务的app;
- 业务调用方 即使用authenticators提供的帐号服务的第三方,也可以是authenticator自己

使用AccountManager注册帐号服务

如果应用想要注册一个新的帐号服务,必须实现AbstractAccountAuthenticator类,这是创建一个account authenticator的抽象基础类;然后新建一个authenticator service,注册action必须为”android.accounts.AccountAuthenticator”,且该service要实现onBinder(android.content.Intent)方法,返回AbstractAccountAuthenticator实现类的实例

说下必须要注册一个action为”android.accounts.AccountAuthenticator”的authenticator service
首先,AbstractAccountAuthenticator是创建一个account authenticator必须实现的抽象基础类,接口协议定义在IAccountAuthenticator中,是一个authenticator自定义自己登录/认证等的接口协议;
那如何将authenticator的实现回调给AccountManagerService,供其调起authenticator的具体实现呢?
就是通过action注册为”android.accounts.AccountAuthenticator”的authenticator service了:
这个action即为AccountManager#ACTION_AUTHENTICATOR_INTENT的常量值,系统服务AccountManagerService是通过bind到action为AccountManager#ACTION_AUTHENTICATOR_INTENT的intent service上来调起某个账号类型的authenticator service,然后通过调用这个service的getBinder()方法来获取AbstractAccountAuthenticator的实现实例,进而调用authenticator对帐号登录认证等服务的具体实现
至于每个帐号服务都定义一个action为”android.accounts.AccountAuthenticator”的service,那AccountManagerService是如何区分的呢?
当然是通过账号类型了,每个accountType只能对应一个authenticator
那系统是如何知道每个authenticator service对应的账号类型?
在AndroidManifest.xml中注册authenticator service时声明帐号属性的meta-data配置,声明的meta-data是一个name为 “android.accounts.AccountAuthenticator”的xml 资源(AccountManager#AUTHENTICATOR_META_DATA_NAME),该XML资源文件定义了account-authenticator用到的一些属性:如accountType;系统解析authenticator service info之后,loadXmlMetaData获取authenticator 的xml属性,然后利用 Xml.asAttributeSet即

final PackageManager pm = mContext.getPackageManager();
final  List<ResolveInfo> resolveInfos =  pm.queryIntentServicesAsUser(new Intent("android.accounts.AccountAuthenticator", PackageManager.GET_META_DATA | PackageManager.MATCH_DIRECT_BOOT_AWARE| PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
for (ResolveInfo resolveInfo : resolveInfos) {android.content.pm.ServiceInfo si = service.serviceInfo;ComponentName componentName = new ComponentName(si.packageName, si.name);PackageManager pm = mContext.getPackageManager();XmlResourceParser parser = null;try {parser = si.loadXmlMetaData(pm, "android.accounts.AccountAuthenticator")if (parser == null) {throw new XmlPullParserException("No " + mMetaDataName + " meta-data");}AttributeSet attrs = Xml.asAttributeSet(parser);...//解析authenticator xml的帐号属性}...
}

注册一个测试帐号

创建一个继承自AbstractAccountAuthenticator的类TestAccountAuthenticator

public class TestAccountAuthenticator extends AbstractAccountAuthenticator {private Context mContext;public TestAccountAuthenticator(Context context) {super(context);mContext = context;}@Overridepublic Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {return null;}@Overridepublic Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {//登录界面的定制化实现Intent addAccountIntent = new Intent(mContext, LoginActivity.class);addAccountIntent.putExtra("authTokenType", authTokenType);if (options != null) {addAccountIntent.putExtras(options);}addAccountIntent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);//一定要把response传入intent的extra中,便于将登录操作的结果回调给AccountManagerBundle bundle = new Bundle();bundle.putParcelable(AccountManager.KEY_INTENT, addAccountIntent);return bundle;}@Overridepublic Bundle getAccountRemovalAllowed(AccountAuthenticatorResponse response, Account account) throws NetworkErrorException {//是否允许删除你的账号,这里是不允许删除,可自定义什么时候可以被删除,默认是trueBundle bundle = new Bundle();bundle.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, false);return bundle;}@Overridepublic Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options)throws NetworkErrorException {//自己实现:验证用户的密码return null;}@Overridepublic Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options)throws NetworkErrorException {//自己完成获取鉴权token的流程return null;}@Overridepublic String getAuthTokenLabel(String authTokenType) {return null;}@Overridepublic Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options)throws NetworkErrorException {return null;}@Overridepublic Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {return null;}
}

创建一个authenticator service—TestAuthenticatiorService,实现onBinder()方法,在onBinder方法里返回TestAccountAuthentcator的实例

public class TestAuthenticatiorService extends Service {private static final String TAG = "XmAuthenticationService";private TestAccountAuthenticator mAuthenticator;@Overridepublic void onCreate() {super.onCreate();mAuthenticator = new TestAccountAuthenticator(this);}@Nullable@Overridepublic IBinder onBind(Intent intent) {return mAuthenticator.getIBinder();}
}

在AndroidManifest.xml文件中注册该TestAuthenticatorService

<service
    android:name=".TestAuthenticatiorService"android:exported="true"><intent-filter><action android:name="android.accounts.AccountAuthenticator" /></intent-filter><meta-data
        android:name="android.accounts.AccountAuthenticator"android:resource="@xml/authenticator" />
</service>

其中,authenticator是一个xml的资源文件,定义了account的一些属性

 <?xml version="1.0" encoding="utf-8"?><account-authenticator
 xmlns:android="http://schemas.android.com/apk/res/android"android:accountType="com.test"//账号类型android:icon="@drawable/icon"//设置-同步-添加 账号类型的iconandroid:smallIcon="@drawable/miniIcon"//小iconandroid:label="@string/label"//设置-同步-添加 账号类型的名称android:accountPreferences="@xml/account_preferences"//在设置中展示的一些偏好android:customTokens="false"//authenticator是否要自己处理auth token的存储和获取权限
/>

ps:说下customTokens属性
如设置为true,就需要在TestAccountAuthenticator类的getAuthToken方法的实现中自己进行caller app的权限检查和token存储问题
如不设置(默认为false)或设置为false,则是使用AccountManager的权限检查和存储机制,默认只有签名相同的app才可调用getAuthToken()方法,存储在系统数据库中,但要app判断是否有效,失效要调用invalidate才可清除系统的存储

到这里,你就成功注册了一个新的帐号类型了

Android AccountManager帐号管理(一)相关推荐

  1. Android AccountManager帐号管理(二)

    Android AccountManager 帐号管理(一)分享了如何将自己的帐号体系注册到系统服务AccountManagerService,统一由AccountManager来管理,这仅是自己的一 ...

  2. Android AccountManager 账户同步管理简单介绍

    Android AccountManager 账户同步管理简单介绍 文章目录 Android AccountManager 账户同步管理简单介绍 前言 AccountManager 简介 如何让自己的 ...

  3. ultra edit ftp帐号管理导入导出方法

    在更换电脑或ultra edit新安装时往往需要将原来使用的ftp帐号导入过来,可以在高级-备份/恢复用户定制-选中其他保存备份,拷贝出来然后再导入. 也可以在配置-ftp/sftp中保存,拷贝出来然 ...

  4. mysql fulsh_MYSQL教程:MySQL用户帐号管理_MySQL

    MySQL用户帐号管理主要用grant(授权)和revoke(撤权)两个SQL指令来管理.这两个指令实质是通过操作user(连接权限和全局权限).db(数据库级权限).tables_priv(数据表级 ...

  5. linux账号安全管理,保证Linux系统安全——帐号管理

    不论是Windows操做系统仍是Linux操做系统,想要登陆系统必需要有合法的帐户及密码.本篇博文主要介绍Linux系统下的帐户信息.web 博文大纲: 1.Linux系统的帐号及群组 1.UID与G ...

  6. Linux--账号和权限管理(用户账号和组账号,用户账号和组帐号管理,文件和目录的权限和归属)

    文章目录 前言 一.用户账号和组账号 1.1用户账号 1.2组账号 1.3UID号和GID号 1.4用户账号文件 1.4.1用户账号文件/etc/passwd 1.4.2用户账号文件/etc/shad ...

  7. linux系统用户帐号管理

    Hellow,我是jack,今天给大家分享的是linux 系统的账号管理.话不多说,让我们直接进入正题. 俗话说"花有百样红",所以我们每个人在使用计算机使也会有不同的方式或方法, ...

  8. Windows 帐号管理相关操作

    1.  增加\删除 user到指定的group 右击"我的电脑"--> 管理 --> System Tools --> Local User and Groups ...

  9. 手把手教你成为荣耀开发者:帐号管理这样做

    荣耀开发者服务平台是荣耀面向开发者的统一生态入口,通过聚合周边内外部系统,分全球多站点部署,为全球开发者提供业务全生命周期的商业支撑服务,拥有应用分发.智慧服务.开放能力.HONOR Connect等 ...

最新文章

  1. 链式比较、奇怪的字母、有趣的import...Python冷知识(六)
  2. Sqlserver 2000 迷你、便携企业管理器(10M),支持Dts编辑
  3. rocketmq源码解析之name启动(一)
  4. python 同时给多个变量赋值
  5. 开始使用Bootstrap
  6. AutoMapper在asp.netcore中的使用
  7. 设置mysql的interactive_timeout和wait_timeout的值
  8. dj鲜生-26-登陆时-记住用户名的操作
  9. c通过位运算求绝对值_初中数学归类总结(四)有理数的乘除乘方及混合运算...
  10. DLog-M什么意思
  11. 关于.h 与 汇编中的.inc文件
  12. php pdf 生成分页,关于XSL生成PDF分页的问题
  13. 计算机基础——局域网、以太网技术、令牌环网
  14. VTK_Learning_频域处理_快速傅里叶变换及其反变换
  15. 常用软件安装及破解——IntelliJ IDEA
  16. 白领沉迷EXCEL式生存
  17. linux rz位置,Linux下rz命令使用的实例详解
  18. 字迹早就透露了你的性格:豪放者字体较大
  19. 基于jQuery的日历+每日签到功能
  20. 599元红米狂欢背后的冷思考

热门文章

  1. FPGA时序约束建立时间与保持时间概念
  2. 错误集(大概会持续更新)
  3. yyk冷热启动耗时.bat
  4. 一种控制方法并发的注解方法,@Ylock
  5. hiho 挑战赛16 B 王胖浩与环
  6. 前端屏幕尺寸和分辨率_屏幕尺寸、分辨率、倍率到底是什么鬼
  7. 计算机桌面显示器,屏幕分辨率
  8. 安卓中的BP、AP、NV是什么意思?
  9. 解决‘parent.relativePath‘ of POM com.myfun:taskWeb:0.0.1-SNAPSHOT (D:\project wo
  10. SAP中“管理/寄售移动被无值记账”提示问题分析处理实例