在sdk目录下有个示例项目SampleSyncAdapter,演示了 用户授权和同步适配器的一些内容,是个学习的很好范例。我读了很久,很多地方没搞明白,先把理解的一些记录下来。
通过学习该示例,你可以做到:
authenticator包
AuthenticationService 继承自Service,认证服务 拿Authenticator作为成员,在onBind时返回mAuthenticator.getIBinder()
Authenticator 继承AbstractAccountAuthenticator 验证器 public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,String authTokenType,
String[] requiredFeatures, Bundle options) 添加账户。返回一个intent,this intent 用于启动 登录页。
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,String authTokenType, Bundle loginOptions) 获得 authToken。先从账户管理器里取密码, 如果能得到密码,则将账户密码使用NetworkUtilities.authenticate以获得authToken 如果未得到,则将用户名和账户类型发送到 登录页,以再次认证。
AuthenticatorActivity ,继承自 AccountAuthenticatorActivity 登录页,显示用户名和密码输入框,等待用户输入。点击登录按钮后触发handleLogin事件, 在这里先验证用户输入非空,启动UserLoginTask。 在doInBackground中调用NetworkUtilities.authenticate获得authToken, 完成后保存用户名和密码。
client包
NetworkUtilities: public static String authenticate(String username, String password) 发送用户名和密码到服务端,收到 authToken字符串 public static List<RawContact> syncContacts( Account account, String authtoken, long serverSyncState, List<RawContact> dirtyContacts) 发送 用户名和authToken,serverSyncState, 和一个 联系人集合到服务端, 收到一个联系人集合 public static byte[] downloadAvatar(final String avatarUrl) 通过一个URL,获得用户头像的 字节集合 RawContact: 联系人信息的实体bean
notifier包 NotifierService: 通知服务,Service to handle view notifications. This allows the sample sync adapter to update the information when the contact is being looked at syncadapter syncadapter包 SyncAdapter:同步服务,继承自AbstractThreadedSyncAdapter public void onPerformSync(Account account, Bundle extras, String authority,ContentProviderClient provider, SyncResult syncResult) 处理同步,获得同步标记,获得需要同步的联系人,更新联系人,保存同步标记 SyncService:继承自Service 拿SyncAdapter作为成员,在onBind时返回 sSyncAdapter.getSyncAdapterBinder()
Constants 常量,声明 账户类型ACCOUNT_TYPE,授权标记类型AUTHTOKEN_TYPE
****************************************************************************************
为指定账户设定密码
mAccountManager.setPassword(account, mPassword);
添加账户到 账户中心
final Account account = new Account(mUsername, Constants.ACCOUNT_TYPE);
mAccountManager.addAccountExplicitly(account, mPassword, null);
获得authToken
final String authtoken = mAccountManager.blockingGetAuthToken(account,
Constants.AUTHTOKEN_TYPE, NOTIFY_AUTH_FAILURE);
获得用户数据
String markerString = mAccountManager.getUserData(account, SYNC_MARKER_KEY);
参考:
http://yarin.blog.51cto.com/1130898/479032/
http://www.cnblogs.com/fengzhblog/p/3177002.html
http://blog.csdn.net/wutianyin222/article/details/7911858
http://mobile.51cto.com/aprogram-392392.htm
http://mobile.51cto.com/aprogram-392388.htm