频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
基于Andoird 4.2.2的Account Manager源代码分析学习:AccountManager的简要工作流程
2013-07-04 10:29:28           
收藏   我要投稿

- 对于帐号管理,由接口IAccountManager描述其相关的一组行为
- AccountManagerService是Android系统服务。它实现了接口IAccountManager定义的这一组行为。这些行为的实现依赖应用程序中定义的Authenticator。

- AccountManager是一个面向应用程序开发组件。它提供一组对应于IAccountManager协议的应用程序接口。这组接口通过Binder机制与系统服务AccountManagerService进行通信,协作完成帐户相关的操作。同时,AccountManager接收应用程序提供的回调,以此在帐号操作完成之后向应用程序返回对应的结果,同时触发应用程序层对这个结果的处理。

 


以addAccount()操作为例,步骤如下:


1. AccountManager初始化一个匿名的AmsTask子类实例。AmsTask是AccountManager的内部类:

 

[java]  private abstract class AmsTask extends FutureTask<Bundle> implements AccountManagerFuture<Bundle> { 
    final IAccountManagerResponse mResponse; 
    final Handler mHandler; 
    final AccountManagerCallback<Bundle> mCallback; 
    final Activity mActivity; 
    public AmsTask(Activity activity, Handler handler, AccountManagerCallback<Bundle> callback) { 
        super(new Callable<Bundle>() { 
            public Bundle call() throws Exception { 
                throw new IllegalStateException("this should never be called"); 
            } 
        }); 
 
        mHandler = handler; 
        mCallback = callback; 
        mActivity = activity; 
        mResponse = new Response(); 
    } 
    ... 

    private abstract class AmsTask extends FutureTask<Bundle> implements AccountManagerFuture<Bundle> {
        final IAccountManagerResponse mResponse;
        final Handler mHandler;
        final AccountManagerCallback<Bundle> mCallback;
        final Activity mActivity;
        public AmsTask(Activity activity, Handler handler, AccountManagerCallback<Bundle> callback) {
            super(new Callable<Bundle>() {
                public Bundle call() throws Exception {
                    throw new IllegalStateException("this should never be called");
                }
            });

            mHandler = handler;
            mCallback = callback;
            mActivity = activity;
            mResponse = new Response();
        }
        ...
它是一个FutureTask子类,执行异步的任务,并返回结果。
addAccount()中的匿名子类实现了AmsTask.doWork()方法:

 

[java] public AccountManagerFuture<Bundle> addAccount(final String accountType, 
        final String authTokenType, final String[] requiredFeatures, 
        final Bundle addAccountOptions, 
        final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) { 
    ... 
    return new AmsTask(activity, handler, callback) { 
        public void doWork() throws RemoteException { 
            mService.addAcount(mResponse, accountType, authTokenType, 
                    requiredFeatures, activity != null, optionsIn); 
        } 
    }.start(); 

    public AccountManagerFuture<Bundle> addAccount(final String accountType,
            final String authTokenType, final String[] requiredFeatures,
            final Bundle addAccountOptions,
            final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
        ...
        return new AmsTask(activity, handler, callback) {
            public void doWork() throws RemoteException {
                mService.addAcount(mResponse, accountType, authTokenType,
                        requiredFeatures, activity != null, optionsIn);
            }
        }.start();
    }

在doWork()方法的实现中,调用AccountManager持有的AccountManagerService的代理对象(mService)向AccountManagerService发起IPC。


2. AccountManger调用AmsTask匿名子类的start()方法启动任务。
3. start()方法会调用本类的doWork()方法,在这里就是执行AccountManagerService的addAccount()操作。
4. 根据FutureTask的实现机制,在任务执行的结束时期,会调用本类的done()方法。AmsTask类覆盖了这个方法:

 

[java]  protected void done() { 
    if (mCallback != null) { 
        postToHandler(mHandler, mCallback, this); 
    } 

        protected void done() {
            if (mCallback != null) {
                postToHandler(mHandler, mCallback, this);
            }
        }
这里的实现调用了AccountManager.postHandler()方法。看名字就可以猜到,这里将mCallback回调对象里面的run()方法传送给主线程的handler进行调用:

 

[java]  private void postToHandler(Handler handler, final AccountManagerCallback<Bundle> callback, 
        final AccountManagerFuture<Bundle> future) { 
    handler = handler == null ? mMainHandler : handler; 
    handler.post(new Runnable() { 
        public void run() { 
            callback.run(future); 
        } 
    }); 

    private void postToHandler(Handler handler, final AccountManagerCallback<Bundle> callback,
            final AccountManagerFuture<Bundle> future) {
        handler = handler == null ? mMainHandler : handler;
        handler.post(new Runnable() {
            public void run() {
                callback.run(future);
            }
        });
    }

在这一次调用中,三个参数的来源分别是:
- handler: mHandler,即当前应用的主线程
- callback: 这个由调用AccountManager的应用程序提供
- future: this,即当前AmsTask实例,它实现了AccountManagerCallback接口,包含的是跨进成执行添加帐号操作的返回结果,是一个Bundler对象:
** 包含一个Intent实例:表明帐号创建需要启动其指定的activity来与用户交互,用户将提供验证信息,如用户名、密码
** 或者包含已经创建的帐号的名称和类型
而应用程序将根据这个Bundle里面封装的实际内容采取下一步行动。

 

点击复制链接 与好友分享!回本站首页
上一篇:android 4.0 中出错 java.lang.UnsupportedOperationException
下一篇:android jni ——Field & Method --> Accessing Field
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站