- 浏览: 68190 次
- 性别:
- 来自: 济南
最新评论
-
zhenzxie:
somefuture 写道你了解的真多。可以当个字典。谢谢鼓励 ...
Android学习之路——开始 -
somefuture:
你了解的真多。可以当个字典。
Android学习之路——开始 -
zhenzxie:
不能说是做,在学习吧。。
第二届 Android 应用开发中国大学生挑战赛作品--Happy Ball -
juedui0769:
现在还在做android么?
第二届 Android 应用开发中国大学生挑战赛作品--Happy Ball -
zhenzxie:
juedui0769 写道 下载完了下,太难操作了!第一次完成 ...
第二届 Android 应用开发中国大学生挑战赛作品--Happy Ball
Android学习之路——6.android.account包和AbstractThreadedSyncAdapter适配器
- 博客分类:
- Android
android.account包和AbstractThreadedSyncAdapter适配器
(一)简介:
(1)接口:
AccountManagerCallback<V>: 配合AccountManager类使用的回调接口,实现接口的类对象作为参数传给AccountManager的方法,方法在完成某项异步事务后实现回调。
AccountManagerFuture<V>: 表示调用AccountManager异步方法的结果,可以使用它的getResult()在非UI线程中进行查询异步方法结果。
OnAccountsUpdateListener: 配合AccountManager类使用的回调接口,当同步的帐号发生变化时被调用
(2)类:
AbstractAccountAuthenticator: 创建Authenticator的抽象基类
Account: 同步帐号的表示类,含有name和type两个实例域
AccountAuthenticatorActivity: 当AbstractAccountAuthenticator需要用户认证时使用的基类Activity
AccountAuthenticatorResponse: AbstractAccountAuthenticator用来回馈AccountManager的对象(API原文:Object used to communicate responses back to the AccountManager。)
AccountManager: 集中管理用户要同步的在线帐号的类
AuthenticatorDescription: 一个可以Parcelable的,含有AccountAuthenticator类的具体信息
(3)异常:
AccountsException
AuthenticatorException
NetworkErrorException
OperationCanceledException
(4)AbstractThreadedSyncAdapter类:会开启一个线程去调用同步操作的抽象接口。
(二)介绍:
(1)Account:代表着在AccountManager中使用的值类型,这个类是实现了Parcelable接口,并且重写equals()和hashCode()方法,可以在map中使用。含有两个public final String 的实例域name和type,代表Account的名字和类型。
(2)AccountManager:
AccountManager提供了很多关于Account的操作,获得这个类的实例的方式是:AccountManager.get(Context)或者Context.getSystemService(Context.ACCOUNT_SERVICE)。但是不知道为什么在AccountManager里使用的IAccountManager这个类(或者接口)在Eclipse里打不开。
但是可以知道的是AccountManager提供的方法分两种不同类型,一种是同步的,一种是异步的。异步的方法在参数方面都是需要提供一个AccountManagerCallback接口实例和一个Handler实例,返回了一个AccountManagerFuture的接口实例。AccountManagerCallback和AccountManagerFuture都使用了泛型。应该可以认为AccountManagerFuture和AccountManagerCallback都是配合AccountManager使用的吧。
AccountManagerFuture表示的是异步调用AccountManager的结果,提供了查询和取消的方法,getResult的方法查询对AccountManager方法的调用结果,这个方法会阻塞。cancel可以取消对AccountManager方法的调用。另外提供了isCancelled()和isDone()方法来查询状态,如果已经实现了,就不能取消。对于getResult()的调用不能在主线程中进行。当对AccountManager方法的调用结束时,会调用参数中提供的AccountManagerCallback中的run方法,这个调用是通过你提供的Handler实现的(Handler参数为空时则使用默认的mMainHandler):
那么可以在AccountManagerCallback中的run方法中使用AccountManagerFuture的getResult()方法,从而获得结果。
另外:发现在和android.account包里的类里有使用到这样一些类(IAccountAuthenticator,IAccountAuthenticatorResponse,IAccountManager,IAccountManagerResponse)文件保存为aidl格式,无法在Eclipse中打开,可以用记事本打开。(参考资料在:android-sdk\docs\guide\developing\tools\aidl.html)
(3)AbstractAccountAuthenticator:
android.accounts.AbstractAccountAuthenticator定义处理Setting->“Accounts&sync”中Account的添加和验证等功能的基本接口,并实现了一些基本功能。AbstractAccountAuthenticator里面有个继承于IAccountAuthenticator.Stub的内部类,以用来对AbstractAccountAuthenticator的远程接口调用进行包装。我们可以通过AbstractAccountAuthenticator的getIBinder()方法,返回内部类的IBinder形式,以便对AbstractAccountAuthenticator进行远程调用(现在还不懂)。
AbstractAccountAuthenticator是一个创建AccountAuthenticators的抽象基类,一个类要成为authenticatior必须要继承这个类,实现抽象方法,并且实现一个Service,当调用Intent,action为ACTION_AUTHENTICATOR_INTENT时在这个Service的onBind(Intent)方法中返回getIBinder()的结果(API原文:provider implementations for the abstract methods and write a service that returns the result of getIBinder() in the service's onBind(android.content.Intent) when invoked with an intent with action ACTION_AUTHENTICATOR_INTENT),getIBinder() 返回其用于远程调用的IBinder。这个service要在intent filter和metadata标签中指定:
其中android resource必须指向如下这样的资源,所指向的xml文件应该说明该Account在“Accounts&sync”中的基本显示信息 :
上述resource 中比较重要的是account:Type属性,它必须是一个唯一表示你的Authenticator的字符串,当用户调用AccountManager时也是使用这个字符串,并且它和你的Account的Type是匹配的。还有就是android:accountPreferences属性,它指向这样的首选项:
当调用管理Authenticator时就会使用这个PreferenceScreens
override AbstractAccountAuthenticator那些抽象方法的标准样式如下:
①如果提供了足够多的参数,则进行处理,返回一个含有结果的Bundle。
②如果Authenticator需要更多来自用户确定请求的信息,那么创建一个Intent去启动一个Activity来提示用户相关信息,然后处理请求。这个Intent必须在Bundle中以KEY_INTENT为键返回。启动的Activity当结束时必须返回最终结果,所以Intent中也要含有以KEY_ACCOUNT_MANAGER_RESPONSE为键的AccountAuthenticatorResponse,当Activity结束时,必须调用onResult(Bundle) 或者 onError(int, String)。可以使用继承AccountAuthenticatorActivity的子类来完成所需的Activity。
③如果Authenticator不能同步处理请求然后返回结果,那么它可能选择返回null,当处理完请求时那么使用AccountManagerResponse来发送结果。
类中的方法有:
addAccount():添加一个特定类型的帐号类型
confirmCredentials():检查帐号的证书
getAuthToken():获得某个帐号的authtoken
updateCredentials():更新本地帐号的证书
(4)AccountAuthenticatorResponse:一个用来和AccountManager交流的对象(Object used to communicate responses back to the AccountManager)。主要方法是:onError()和onResult()
(5)AccountAuthenticatorActivity :一个AbstractAccountAuthenticator的帮助类的基本实现(Base class for implementing an Activity that is used to help implement an AbstractAccountAuthenticator),如果AbstractAccountAuthenticator需要一个Activity来出来处理请求,那么可以使用继承AccountAuthenticatorActivity的类。
启动Activity时,将AccountAuthenticatorResponse以KEY_ACCOUNT_AUTHENTICATOR_RESPONSE为键放到Intent中。要传递给response进行处理的结果将通过setAccountAuthenticatorResult(android.os.Bundle).来设置(API原文:The activity then sets the result that is to be handed to the response via setAccountAuthenticatorResult(android.os.Bundle).),这些结果会在Activity Finish的时候当作请求的结果而发送。如果它没有被设置或者设置为null,这引发response调用ERROR_CODE_CANCELED。AccountAuthenticatorActivity的代码实现很简单。主要是override Activity中的onCreate(Bundle)方法和finish()方法,另外又实现了一个setAccountAuthenticatorResult(android.os.Bundle)方法。
由上面代码很清晰的看到AccountAuthenticatorActivity的注意事项
(6)AbstractThreadedSyncAdapter:一个开启线程去调用同步操作的抽象接口,为了实现一个同步适配器就必须去继承它,并实现它的方法,另外还要实现一个action为android.content.SyncAdapter的Service,在这个Service的onBind(Intent)方法中调用并返回getSyncAdapterBinder()的结果。它主要有四个方法onPerformSync()onSyncCanceled()onSyncCanceled() getSyncAdapterBinder()。继承AbstractThreadedSysncAdapter时,主要要实现onPerformSync()方法,在这个方法中google的示例程序SampleSyncAdapter中使用了AccoutManager,ContactManager和NetworkUtilities三个类。另外实现的Service需要在AndroidManifest.xml中指定特定的intent-filter和meta-data如下:
android:resource指向这样的资源:
(三)android.account包和AbstractThreadedSyncAdapter适配器的使用(google的实例工程SampleSyncAdapter):
(1)Authenticator,AuthenticatorActivity,AuthenticationService的实现
Authenticator继承了AbstractAccountAuthenticator,实现了addAccount() getAuthToken() hasFeatures()三个方法。addAccount()方法中,创建了一个Intent,把AuthenticatorActivity.class传递给构造方法,应该是为了启动AuthenticatorActivity吧。然后把参数中的AccountAuthenticatorResponse对象以AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE为键放到intent中,接着把这个intent以AccountManager.KEY_INTENT为键放到一个Bundle中,并返回这个Bundle。getAuthToken()方法,先验证了password是否有效,有效的话返回一个含有Account.name,帐号类型,和authToken的Bundle,否则返回一个含有AccountManager.KEY_INTENT为键的intent的Bundle。
AuthenticatorActivity继承AccountAuthenticatorActivity,当用户填好用户和密码并点击signin按钮时,将调用handleLogin(View)。(插播一句:在xml中通过设置Button的onClick属性来设置监听,处理事件)在handleLogin(View)方法中创建了一个AsynTask的子类对象,并调用execute()方法,这个方法将回调AsynTask的子类对象中的doInBackground()从而在后台实现帐号的认证,并返回token。当doInBackground()结束后,会在UI线程中继续调用该类的onPostExecute(),接着更改本地存储的信息,再接着使用setAccountAuthenticatorResult(Bundle)方法将结果保存到父类中,然后再调用的父类的finish()方法来调用AccountAuthenticatorResponse的onResult()或者onError()方法将结果返回。而在AccountAuthenticatorResponse的onResult()或者onError()方法中又是使用IAccountAuthenticatorResponse这个的相应方法进行远程调用。所以可以知道在AuthenticatorActivity中主要是提供接受用户帐号和密码,然后认证,然后更改本地存储的信息,最后返回。
这个工程里并没有使用到AccountManagerCallback<V> AccountManagerFuture<V> OnAccountsUpdateListener 接口,主要是没调用AccoutManager中的异步方法
AuthenticationServise:继承Service,在onCreate(Bundle)方法中创建了Authenticator实例,在onBindle(Intent)方法中返回Authenticator.getIBinder()的结果。在AndroidManifest.xml中的声明
(2)SyncAdapter,SyncService的实现
SyncAdapter继承AbstractThreadedSyncAdapter,复写了onPerformSync()方法,在这个方法里实现了同步
SyncService继承Service,在onCreate(Bundle)中创建SyncAdapter实例,在onBind(Intent)返回SyncAdaper.getSyncAdapterBinder()的结果。
(3)整个的使用过程:
首先这android.account包和AbstractThreadedSyncAdapter应该是某些服务商在开发自己的客户端程序使用的,通过它们来方便地实现自己的客户端上的帐号同步。创建AbstractAccountAuthenticator子类,来实现自定义认证器的功能,主要需复写的方法如上述,可以通过AccoutManager来管理帐号。实现Service的子类向系统注册Authenticator,之后只要在setting中的Accounts&sync里要对帐号添加,删除等操作都会调用AbstractAccountAuthenticator子类中的相应方法。有必要的话提供相应的Activity(继承AccountAuthenticatorActivity)来提供相应的UI界面,接受用户输入。另外创建AbstractThreadedSyncAdapter子类,复写onPerformSync()方法实现自定义的同步方法,和AbstractAccountAuthenticator相同,它也通过Service子类来向系统注册服务,每次需要更新时,都调用onPerformSync()方法。
Demo来自google的实例程序SampleSyncAdapter
(一)简介:
(1)接口:
AccountManagerCallback<V>: 配合AccountManager类使用的回调接口,实现接口的类对象作为参数传给AccountManager的方法,方法在完成某项异步事务后实现回调。
AccountManagerFuture<V>: 表示调用AccountManager异步方法的结果,可以使用它的getResult()在非UI线程中进行查询异步方法结果。
OnAccountsUpdateListener: 配合AccountManager类使用的回调接口,当同步的帐号发生变化时被调用
(2)类:
AbstractAccountAuthenticator: 创建Authenticator的抽象基类
Account: 同步帐号的表示类,含有name和type两个实例域
AccountAuthenticatorActivity: 当AbstractAccountAuthenticator需要用户认证时使用的基类Activity
AccountAuthenticatorResponse: AbstractAccountAuthenticator用来回馈AccountManager的对象(API原文:Object used to communicate responses back to the AccountManager。)
AccountManager: 集中管理用户要同步的在线帐号的类
AuthenticatorDescription: 一个可以Parcelable的,含有AccountAuthenticator类的具体信息
(3)异常:
AccountsException
AuthenticatorException
NetworkErrorException
OperationCanceledException
(4)AbstractThreadedSyncAdapter类:会开启一个线程去调用同步操作的抽象接口。
(二)介绍:
(1)Account:代表着在AccountManager中使用的值类型,这个类是实现了Parcelable接口,并且重写equals()和hashCode()方法,可以在map中使用。含有两个public final String 的实例域name和type,代表Account的名字和类型。
(2)AccountManager:
AccountManager提供了很多关于Account的操作,获得这个类的实例的方式是:AccountManager.get(Context)或者Context.getSystemService(Context.ACCOUNT_SERVICE)。但是不知道为什么在AccountManager里使用的IAccountManager这个类(或者接口)在Eclipse里打不开。
但是可以知道的是AccountManager提供的方法分两种不同类型,一种是同步的,一种是异步的。异步的方法在参数方面都是需要提供一个AccountManagerCallback接口实例和一个Handler实例,返回了一个AccountManagerFuture的接口实例。AccountManagerCallback和AccountManagerFuture都使用了泛型。应该可以认为AccountManagerFuture和AccountManagerCallback都是配合AccountManager使用的吧。
AccountManagerFuture表示的是异步调用AccountManager的结果,提供了查询和取消的方法,getResult的方法查询对AccountManager方法的调用结果,这个方法会阻塞。cancel可以取消对AccountManager方法的调用。另外提供了isCancelled()和isDone()方法来查询状态,如果已经实现了,就不能取消。对于getResult()的调用不能在主线程中进行。当对AccountManager方法的调用结束时,会调用参数中提供的AccountManagerCallback中的run方法,这个调用是通过你提供的Handler实现的(Handler参数为空时则使用默认的mMainHandler):
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); } }); }
那么可以在AccountManagerCallback中的run方法中使用AccountManagerFuture的getResult()方法,从而获得结果。
另外:发现在和android.account包里的类里有使用到这样一些类(IAccountAuthenticator,IAccountAuthenticatorResponse,IAccountManager,IAccountManagerResponse)文件保存为aidl格式,无法在Eclipse中打开,可以用记事本打开。(参考资料在:android-sdk\docs\guide\developing\tools\aidl.html)
(3)AbstractAccountAuthenticator:
android.accounts.AbstractAccountAuthenticator定义处理Setting->“Accounts&sync”中Account的添加和验证等功能的基本接口,并实现了一些基本功能。AbstractAccountAuthenticator里面有个继承于IAccountAuthenticator.Stub的内部类,以用来对AbstractAccountAuthenticator的远程接口调用进行包装。我们可以通过AbstractAccountAuthenticator的getIBinder()方法,返回内部类的IBinder形式,以便对AbstractAccountAuthenticator进行远程调用(现在还不懂)。
AbstractAccountAuthenticator是一个创建AccountAuthenticators的抽象基类,一个类要成为authenticatior必须要继承这个类,实现抽象方法,并且实现一个Service,当调用Intent,action为ACTION_AUTHENTICATOR_INTENT时在这个Service的onBind(Intent)方法中返回getIBinder()的结果(API原文:provider implementations for the abstract methods and write a service that returns the result of getIBinder() in the service's onBind(android.content.Intent) when invoked with an intent with action ACTION_AUTHENTICATOR_INTENT),getIBinder() 返回其用于远程调用的IBinder。这个service要在intent filter和metadata标签中指定:
<action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> <intent-filter>
其中android resource必须指向如下这样的资源,所指向的xml文件应该说明该Account在“Accounts&sync”中的基本显示信息 :
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="typeOfAuthenticator" android:icon="@drawable/icon" android:smallIcon="@drawable/miniIcon" android:label="@string/label" android:accountPreferences="@xml/account_preferences" />
上述resource 中比较重要的是account:Type属性,它必须是一个唯一表示你的Authenticator的字符串,当用户调用AccountManager时也是使用这个字符串,并且它和你的Account的Type是匹配的。还有就是android:accountPreferences属性,它指向这样的首选项:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/title_fmt" /> <PreferenceScreen android:key="key1" android:title="@string/key1_action" android:summary="@string/key1_summary"> <intent android:action="key1.ACTION" android:targetPackage="key1.package" android:targetClass="key1.class" /> </PreferenceScreen> </PreferenceScreen>
当调用管理Authenticator时就会使用这个PreferenceScreens
override AbstractAccountAuthenticator那些抽象方法的标准样式如下:
①如果提供了足够多的参数,则进行处理,返回一个含有结果的Bundle。
②如果Authenticator需要更多来自用户确定请求的信息,那么创建一个Intent去启动一个Activity来提示用户相关信息,然后处理请求。这个Intent必须在Bundle中以KEY_INTENT为键返回。启动的Activity当结束时必须返回最终结果,所以Intent中也要含有以KEY_ACCOUNT_MANAGER_RESPONSE为键的AccountAuthenticatorResponse,当Activity结束时,必须调用onResult(Bundle) 或者 onError(int, String)。可以使用继承AccountAuthenticatorActivity的子类来完成所需的Activity。
③如果Authenticator不能同步处理请求然后返回结果,那么它可能选择返回null,当处理完请求时那么使用AccountManagerResponse来发送结果。
类中的方法有:
addAccount():添加一个特定类型的帐号类型
confirmCredentials():检查帐号的证书
getAuthToken():获得某个帐号的authtoken
updateCredentials():更新本地帐号的证书
(4)AccountAuthenticatorResponse:一个用来和AccountManager交流的对象(Object used to communicate responses back to the AccountManager)。主要方法是:onError()和onResult()
(5)AccountAuthenticatorActivity :一个AbstractAccountAuthenticator的帮助类的基本实现(Base class for implementing an Activity that is used to help implement an AbstractAccountAuthenticator),如果AbstractAccountAuthenticator需要一个Activity来出来处理请求,那么可以使用继承AccountAuthenticatorActivity的类。
启动Activity时,将AccountAuthenticatorResponse以KEY_ACCOUNT_AUTHENTICATOR_RESPONSE为键放到Intent中。要传递给response进行处理的结果将通过setAccountAuthenticatorResult(android.os.Bundle).来设置(API原文:The activity then sets the result that is to be handed to the response via setAccountAuthenticatorResult(android.os.Bundle).),这些结果会在Activity Finish的时候当作请求的结果而发送。如果它没有被设置或者设置为null,这引发response调用ERROR_CODE_CANCELED。AccountAuthenticatorActivity的代码实现很简单。主要是override Activity中的onCreate(Bundle)方法和finish()方法,另外又实现了一个setAccountAuthenticatorResult(android.os.Bundle)方法。
public class AccountAuthenticatorActivity extends Activity { private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null; private Bundle mResultBundle = null; /** * Set the result that is to be sent as the result of the request that caused this * Activity to be launched. If result is null or this method is never called then * the request will be canceled. * @param result this is returned as the result of the AbstractAccountAuthenticator request */ public final void setAccountAuthenticatorResult(Bundle result) { mResultBundle = result; } /** * Retreives the AccountAuthenticatorResponse from either the intent of the icicle, if the * icicle is non-zero. * @param icicle the save instance data of this Activity, may be null */ protected void onCreate(Bundle icicle) { super.onCreate(icicle); mAccountAuthenticatorResponse = getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE); if (mAccountAuthenticatorResponse != null) { mAccountAuthenticatorResponse.onRequestContinued(); } } /** * Sends the result or a Constants.ERROR_CODE_CANCELED error if a result isn't present. */ public void finish() { if (mAccountAuthenticatorResponse != null) { // send the result bundle back if set, otherwise send an error. if (mResultBundle != null) { mAccountAuthenticatorResponse.onResult(mResultBundle); } else { mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled"); } mAccountAuthenticatorResponse = null; } super.finish(); } }
由上面代码很清晰的看到AccountAuthenticatorActivity的注意事项
(6)AbstractThreadedSyncAdapter:一个开启线程去调用同步操作的抽象接口,为了实现一个同步适配器就必须去继承它,并实现它的方法,另外还要实现一个action为android.content.SyncAdapter的Service,在这个Service的onBind(Intent)方法中调用并返回getSyncAdapterBinder()的结果。它主要有四个方法onPerformSync()onSyncCanceled()onSyncCanceled() getSyncAdapterBinder()。继承AbstractThreadedSysncAdapter时,主要要实现onPerformSync()方法,在这个方法中google的示例程序SampleSyncAdapter中使用了AccoutManager,ContactManager和NetworkUtilities三个类。另外实现的Service需要在AndroidManifest.xml中指定特定的intent-filter和meta-data如下:
<intent-filter> <action android:name="android.content.SyncAdapter" /> </intent-filter> <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/syncadapter" />
android:resource指向这样的资源:
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" android:contentAuthority="authority" android:accountType="accountType" android:userVisible="true|false" android:supportsUploading="true|false" android:allowParallelSyncs="true|false" android:isAlwaysSyncable="true|false" android:syncAdapterSettingsAction="ACTION_OF_SETTINGS_ACTIVITY" />
(三)android.account包和AbstractThreadedSyncAdapter适配器的使用(google的实例工程SampleSyncAdapter):
(1)Authenticator,AuthenticatorActivity,AuthenticationService的实现
Authenticator继承了AbstractAccountAuthenticator,实现了addAccount() getAuthToken() hasFeatures()三个方法。addAccount()方法中,创建了一个Intent,把AuthenticatorActivity.class传递给构造方法,应该是为了启动AuthenticatorActivity吧。然后把参数中的AccountAuthenticatorResponse对象以AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE为键放到intent中,接着把这个intent以AccountManager.KEY_INTENT为键放到一个Bundle中,并返回这个Bundle。getAuthToken()方法,先验证了password是否有效,有效的话返回一个含有Account.name,帐号类型,和authToken的Bundle,否则返回一个含有AccountManager.KEY_INTENT为键的intent的Bundle。
AuthenticatorActivity继承AccountAuthenticatorActivity,当用户填好用户和密码并点击signin按钮时,将调用handleLogin(View)。(插播一句:在xml中通过设置Button的onClick属性来设置监听,处理事件)在handleLogin(View)方法中创建了一个AsynTask的子类对象,并调用execute()方法,这个方法将回调AsynTask的子类对象中的doInBackground()从而在后台实现帐号的认证,并返回token。当doInBackground()结束后,会在UI线程中继续调用该类的onPostExecute(),接着更改本地存储的信息,再接着使用setAccountAuthenticatorResult(Bundle)方法将结果保存到父类中,然后再调用的父类的finish()方法来调用AccountAuthenticatorResponse的onResult()或者onError()方法将结果返回。而在AccountAuthenticatorResponse的onResult()或者onError()方法中又是使用IAccountAuthenticatorResponse这个的相应方法进行远程调用。所以可以知道在AuthenticatorActivity中主要是提供接受用户帐号和密码,然后认证,然后更改本地存储的信息,最后返回。
这个工程里并没有使用到AccountManagerCallback<V> AccountManagerFuture<V> OnAccountsUpdateListener 接口,主要是没调用AccoutManager中的异步方法
AuthenticationServise:继承Service,在onCreate(Bundle)方法中创建了Authenticator实例,在onBindle(Intent)方法中返回Authenticator.getIBinder()的结果。在AndroidManifest.xml中的声明
<service android:name=".authenticator.AuthenticationService" 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>
(2)SyncAdapter,SyncService的实现
SyncAdapter继承AbstractThreadedSyncAdapter,复写了onPerformSync()方法,在这个方法里实现了同步
SyncService继承Service,在onCreate(Bundle)中创建SyncAdapter实例,在onBind(Intent)返回SyncAdaper.getSyncAdapterBinder()的结果。
(3)整个的使用过程:
首先这android.account包和AbstractThreadedSyncAdapter应该是某些服务商在开发自己的客户端程序使用的,通过它们来方便地实现自己的客户端上的帐号同步。创建AbstractAccountAuthenticator子类,来实现自定义认证器的功能,主要需复写的方法如上述,可以通过AccoutManager来管理帐号。实现Service的子类向系统注册Authenticator,之后只要在setting中的Accounts&sync里要对帐号添加,删除等操作都会调用AbstractAccountAuthenticator子类中的相应方法。有必要的话提供相应的Activity(继承AccountAuthenticatorActivity)来提供相应的UI界面,接受用户输入。另外创建AbstractThreadedSyncAdapter子类,复写onPerformSync()方法实现自定义的同步方法,和AbstractAccountAuthenticator相同,它也通过Service子类来向系统注册服务,每次需要更新时,都调用onPerformSync()方法。
Demo来自google的实例程序SampleSyncAdapter
- SampleSyncAdapter.zip (169.6 KB)
- 下载次数: 124
发表评论
-
Android学习之路——10.NoClassDefFoundError
2013-04-25 13:15 2224遇到NoClassDefFoundError问题,情景描述如下 ... -
Android学习之路——9.Creating an IME(译)
2012-10-15 19:44 4994学习Android,SDK里的 ... -
Android学习之路——8.Ubuntu下的Android
2012-04-12 09:35 3876我苦逼的Ubuntu系统配置A ... -
Android学习之路——7.Service
2012-03-31 13:42 2664(一)注意的细节: ( ... -
Android学习之路——5.Activity子类
2012-03-30 10:36 5823本篇是翻译的 Activity的直接子类:AccountAut ... -
Android学习之路——4.Activity简介
2012-03-26 23:21 16081.Activity在系统被Activity堆栈管理着,每当一 ... -
Android学习之路——3.Handler的子类
2012-03-18 13:51 2546API中介绍Handler的子类有 ... -
Android学习之路——2.Handler常用的使用方法
2012-03-17 20:57 3824package zhenz.exercise; i ... -
Android学习之路——1.Handler,Message,Looper简介
2012-03-17 20:42 22341.Handler允许你发送和处 ... -
Android学习之路——开始
2012-03-17 15:11 2754在这里开始记录我的Android学习之路 1.activity ... -
Android自定义Adapter--继承于SimpleAdapter
2012-03-17 02:13 8822今天晚上做一个依据数组中元素是否为null,来设置 ... -
第二届 Android 应用开发中国大学生挑战赛作品--Happy Ball
2011-10-09 22:22 1641经过两个星期的努力和一个通宵之后,我的第一个小游戏--Ha ...
相关推荐
《安卓Android源码深度解析——聚焦Email模块》 在安卓操作系统的世界里,源码是开发者探索系统底层工作原理、优化应用性能以及定制个性化系统的钥匙。本篇将深入探讨Android源码中的Email模块,揭示其背后的设计...
《Android项目深度解析:SampleSyncAdapter实战》 在Android开发领域,SampleSyncAdapter是一个非常经典的项目,它...通过学习和实践这个项目,开发者能够掌握如何在Android应用中构建稳定、节能的数据同步解决方案。
android各组件详解——Account 一.Google帐户API 二.帐户列表 三.添加帐户
Android操作系统以其开源、灵活的特点深受开发者喜爱,而Email程序作为Android系统中的核心组件之一,其源码是理解Android系统邮件服务实现机制的重要参考。本文将围绕“Android源码——Email程序源码.zip”这一主题...
《深入解析Android ...总之,分析和学习Android Email程序源码不仅有助于提升对Android系统的理解,也能为开发自己的邮件应用提供宝贵经验。这是一次深入到系统内核的学习旅程,对提升开发者技能树有着重要的意义。
《安卓Android源码解析——基于AccountBook-3的应用开发实践》 在移动应用开发领域,Android平台因其开源、自由度高而备受开发者喜爱。本文将深入探讨一款名为"AccountBook-3"的安卓应用程序源码,旨在帮助读者理解...
《安卓Android源码解析——以AccountBook-3为例》 在安卓开发中,源码学习是提升技术深度的重要途径。本篇文章将深入探讨一个名为"AccountBook-3"的安卓应用源码,它是一个简单的记账应用,我们将通过分析其核心...
<mvc:exclude-mapping path="/account/" /> <bean class="com.hc.interceptor.LoginInterceptor"/> ``` 指定静态资源不拦截 在web.xml文件中,需要指定静态资源不拦截,可以使用servlet-mapping元素指定静态...
在这个项目中,我们可以学习到如何在iOS应用中实现本地通知和远程推送通知,这是iOS用户体验中的重要组成部分。 首先,我们要了解iOS的通知机制。本地通知(Local Notifications)是由应用本身在特定时间或事件触发...
在Android开发中,`AbstractThreadedSyncAdapter` 是一个关键组件,它为开发者提供了一种在后台线程中执行同步操作的方式。这个类是`SyncAdapter`接口的一个抽象实现,目的是确保同步操作不会阻塞用户界面,从而提高...
《Android应用源码分析——AccountBook-3》 在Android应用开发领域,源码学习是提升技术能力的重要途径。本文将深入探讨名为"AccountBook-3"的Android应用源码,以此为实例,解析其中的关键技术和设计模式,帮助...
和其他博客系统强大的功能没法比,开发此系统的目的仅供刚接触ASP.ENT MVC4的童鞋学习参考。 使用方式: 用VS2012打开,这是必须的,然后在你的数据库新建一个数据库,最后ctrl f5运行,程序初次运行,会进入...
.addMenuItem(android.R.color.transparent, R.drawable.yw_menu_account, Const.MENU_ITEMS[0], android.R.color.black, this) .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_favour, ...
SampleSyncAdapter是Android官方提供的一款用于演示如何实现同步适配器(Sync Adapter)的示例代码。本文将深入探讨SampleSyncAdapter的实现原理以及它在同步账号管理中的应用。 首先,让我们了解什么是Sync ...
在Android系统中,同步账号管理是一项重要的功能,它允许应用程序与服务器进行数据同步,例如邮件、联系人和日历等。SampleSyncAdapter是Android官方提供的一款示例代码,用于演示如何实现自定义的同步适配器,以...
6. **android.permission.ACCESS_NETWORK_STATE**:此权限让应用可以查询网络状态,如是否已连接、连接类型以及网络流量信息。 7. **android.permission.ACCESS_SURFACE_FLINGER**:应用获得此权限后,可以使用...
An application that demonstrates how to query the system contacts provider using the ContactsContract API, as well as insert contacts into a specific account. Home A home screen replacement ...
"Elasticsearch官方提供数据案例account.json"是一个很好的学习资源,可以帮助用户理解Elasticsearch如何处理和分析JSON数据。通过导入这个数据集,用户可以实践索引创建、查询编写、数据分析以及使用Kibana进行可视...