1、应用通过在androidmanifest,xml中声明一个带有Intent:android.accounts.AccountAuthenticator的services来向AccountManager注册一个账户类型。同时,类似widget的声明方式,在meta-data中要声明一个xml,在这个xml中描述账户的类型,图标,显示名,等等
通过以上几步就可以在设置->账户与同步中添加一个账户类型了
带有Intent:android.accounts.AccountAuthenticator的services需要继承Services类(废话),关键的一步是onBind回调中返回一个IAccountAuthenticator的IBinder,这个不需要应用层关心,只需要创建一个继承AbstractAccountAuthenticator的类,AbstractAccountAuthenticator已经将IAccountAuthenticator的实现好了(搭了一个框架,通过抽象方法回调子类方法)。
AbstractAccountAuthenticator的子类只需将AbstractAccountAuthenticator的几个抽象方法实现好了,就实现了一个账户的添加了。
其中最重要的方法 addAccount一个方法要求返回一个Bundle
一般的,这个Bundle中都会有个包含登录界面的Activity的Intent,然后通过这个Bundle返回给AccountManager,来启动一个登录界面添加账户。
2、应用通过在androidmanifest,xml中声明一个带有Intent:android.content.SyncAdapter的Service来达到向系统注册一个具有同步功能的账户适配器(sync-adapter). 同时,类似widget的声明方式,在meta-data中要声明一个xml,在这个xml中描述适配器绑定的账户,所要同步的区域(Authority)(如com.android.contactscom.android.calendar com.android.email)等信息,一个适配器只能同步一个Authority,若想使一个账户同步多个Authority,可以向系统注册多个绑定同一账户的sync-adapter。
类似AccountAuthenticator的实现方式,SyncAdapter的Service在onBind中需要返回ISyncAdapter的IBinder,可以通过继承AbstractThreadedSyncAdapter来返回该IBinder,通过实现父类的抽象方法onPerformSync来实现同步功能。
3、如何调用添加账户接口;
1、直接通过AccountManager添加,AccountManager.getInstance().addcount,在该接口中传入,账户等信息,系统就会调用那个账户的登录界面。
2、有时可能想调用所有可以同步该应用的账户接口(如日历可以使用Exchange账户和Google账户),或者特定的一组账户,这时可以传入Intent: Settings.ACTION_ADD_ACCOUNT or android.settings.ADD_ACCOUNT_SETTINGS,这个Intent会调用系统Settings的AddAccount的Activity。如果没有其他参数,那么这个activity和从设置->账户与同步进入的activity没有区别。如果使用putExtra添加额外的参数的话,那么就可以启动一组特定的账户了,具体如下:
Extra: (“authorities”,String[])指定一组authority 用字符串数组传入
Extra:(“account_types”,String[])指定一组账户类型,用字符串数组传入
关于更多AccountAuthenticator和SyncAdapter用法,参考google example:SampleSyncAdapter.