如何构建Android Sync Provider :Part1

简介:

 

Android2.0 SDK带来的一个好东西就是你可以写一个普通的同步供应商程序,并将其与系统的联系薄,日历等集成。唯一的问题是相关的文档十分的少。还有一个糟糕的问题在于,如果你在某一个地方出了错,Android系统就会崩溃重启。面临如此挑战,我依靠这稀少的文档,以及很少的帖子,还有Android地带的一些代码去建立了一个同步程序----Last.fm 。你想要知道怎么去建立你自己的同步程序么?读下去吧

账户验证

第一个令人疑惑的问题就是账户验证问题,你可以从这个地方了解到更多的信息。http://developer.android.com/reference/android/accounts/AbstractAccountAuthenticator.html

这里定义了该账户如何在“账号&同步”设置中出现的。一个账号的的验证需要3部分来实现:1. 一个从onBind方法返回AbstractAccountAuthenticator 子类的一个服务2. 一个Activityt提供用户输入他们的凭据(账号秘密信息),一个xml文件去描述账号信息展示给用户时( an xml file describing how your account should look when displayed to the user.)同时,你也需要在android.mainfest.xml中添加android.permission.AUTHENTICATE_ACCOUNTS权限

服务

验证服务程序期望从一个onBind方法中返回一个AbstractAccountAuthenticator 的子类。如果你坚持不这么做的话,带来的后果就是当你向系统添加一个账号时,android会将会崩溃并且重启。所幸实现AbstractAccountAuthenticator 并不是一件困难的事情,我们只需要实现其中的addAccount方法即可。该方法返回一个Intent,系统将会用他来为用户展示一个登陆框。该如下的实现将会运行我们的service“fm.last.android.sync.LOGIN”.用户等登录完毕后,,会有一个AccountAuthenticatorResponse 对象传出,我们可以用来将其回传给系统。

AccountAuthenticatorService.java

1   import   fm . last . android . LastFm; 
2   import   android . accounts . AbstractAccountAuthenticator; 
3   import   android . accounts . Account; 
4   import   android . accounts . AccountAuthenticatorResponse; 
5   import   android . accounts . AccountManager; 
6   import   android . accounts . NetworkErrorException; 
7   import   android . app . Service; 
8   import   android . content . Context; 
9   import   android . content . Intent; 
10  import   android . os . Bundle; 
11  import   android . os . IBinder; 
12  import   android . util . Log; 
13    
14  /* * 
15    *   Authenticator   service   that   returns   a   subclass   of   AbstractAccountAuthenticator   in   onBind() 
16    */ 
17  public   class   AccountAuthenticatorService   extends   Service   { 
18    private   static   final   String   TAG   =   " AccountAuthenticatorService " ; 
19    private   static   AccountAuthenticatorImpl   sAccountAuthenticator   =   null ; 
20    
21    public   AccountAuthenticatorService()   { 
22      super (); 
23    } 
24    
25    public   IBinder   onBind(Intent   intent)   { 
26      IBinder   ret   =   null ; 
27      if   (intent . getAction() . equals(android . accounts . AccountManager . ACTION_AUTHENTICATOR_INTENT)) 
28        ret   =   getAuthenticator() . getIBinder(); 
29      return   ret; 
30    } 
31    
32    private   AccountAuthenticatorImpl   getAuthenticator()   { 
33      if   (sAccountAuthenticator   = =   null ) 
34        sAccountAuthenticator   =   new   AccountAuthenticatorImpl( this ); 
35      return   sAccountAuthenticator; 
36    } 
37    
38    private   static   class   AccountAuthenticatorImpl   extends   AbstractAccountAuthenticator   { 
39      private   Context   mContext; 
40    
41      public   AccountAuthenticatorImpl(Context   context)   { 
42        super (context); 
43        mContext   =   context; 
44      } 
45    
46      /* 
47        *     The   user   has   requested   to   add   a   new   account   to   the   system.     We   return   an   intent   that   will   launch   our   login   screen   if   the   user   has   not   logged   in   yet, 
48        *     otherwise   our   activity   will   just   pass   the   user's   credentials   on   to   the   account   manager. 
49        */ 
50      @Override 
51      public   Bundle   addAccount(AccountAuthenticatorResponse   response,   String   accountType,   String   authTokenType,   String[]   requiredFeatures,   Bundle   options) 
52          throws   NetworkErrorException   { 
53        Bundle   reply   =   new   Bundle(); 
54        
55        Intent   i   =   new   Intent(mContext,   LastFm . class ); 
56        i . setAction( " fm.last.android.sync.LOGIN " ); 
57        i . putExtra(AccountManager . KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,   response); 
58        reply . putParcelable(AccountManager . KEY_INTENT,   i); 
59        
60        return   reply; 
61      } 
62    
63      @Override 
64      public   Bundle   confirmCredentials(AccountAuthenticatorResponse   response,   Account   account,   Bundle   options)   {
65        return   null ; 
66      } 
67    
68      @Override 
69      public   Bundle   editProperties(AccountAuthenticatorResponse   response,   String   accountType)   { 
70        return   null ; 
71      } 
72    
73      @Override 
74      public   Bundle   getAuthToken(AccountAuthenticatorResponse   response,   Account   account,   String   authTokenType,   Bundle   options)   throws   NetworkErrorException   { 
75        return   null ; 
76      } 
77    
78      @Override 
79      public   String   getAuthTokenLabel(String   authTokenType)   { 
80        return   null ; 
81      } 
82    
83      @Override 
84      public   Bundle   hasFeatures(AccountAuthenticatorResponse   response,   Account   account,   String[]   features)   throws   NetworkErrorException   { 
85        return   null ; 
86      }   
87      @Override 
88      public   Bundle   updateCredentials(AccountAuthenticatorResponse   response,   Account   account,   String   authTokenType,   Bundle   options)   { 
89        return   null ; 
90      } 
91    } 
92  } 
93

该验证服务需要在Android.Mainfest.xml中使用元数据标签定义一下。如下

Snippet from AndroidManifest.xml

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

Xml文件

账号的xml文件中定义了当应用程序与你的账号互动的时候,应用程序将会看到的东西(是不是向国内其他应用程序使用QQ一些应用一样,首先会有一个授权,询问用户当前的应用程序可以访问你的用户的哪些信息?------我的理解)其中包含了用户可读的名字,你所定义的系统账号类型,图标,对一个包含当用户修改账号时可以看到的PreferenceScreens 的xml文件。

authenticator.xml

< account-authenticator  xmlns:android = " http://schemas.android.com/apk/res/android " 
       android:accountType = " fm.last.android.account " 
       android:icon = " @drawable/icon " 
       android:smallIcon = " @drawable/icon " 
       android:label = " @string/app_name " 
       android:accountPreferences = " @xml/account_preferences " / > 
7

account_preferences.xml

1   < PreferenceScreen 
2      xmlns:android = " http://schemas.android.com/apk/res/android " > 
3           < PreferenceCategory 
4                          android:title = " General   Settings "   / > 
5     
6           < PreferenceScreen 
7                  android:key = " account_settings " 
8                  android:title = " Account   Settings " 
9                  android:summary = " Sync   frequency,   notifications,   etc. " > 
10                  < intent 
11                         android:action = " fm.last.android.activity.Preferences.ACCOUNT_SETUP " 
12                         android:targetPackage = " fm.last.android " 
13                         android:targetClass = " fm.last.android.activity.Preferences "   / > 
14          < /PreferenceScreen > 
15  < /PreferenceScreen > 
16

集成(putting it all together)

现在我们可以准备开始测试了。Android 账号的设置部分并不能完好的捕捉异常。如果有地方出错了,设备会重启。最好的测试方式是运行模拟器后,运行DevTools,点击AcountsTester

clip_image001

你会看到一个新的账号类型将会同系统内置的“Corporate”类型的账号一样,被添加到列表中。尽管从下拉列表中选择你的账号,然后点击增加按钮,那么,将会呈现一个你所做的登录框。经过验证后 ,你的账号将会出现在按钮下边的列表中。在这一点,使用系统的“Account&sync”设置去移除和修改账户应该是安全的。

clip_image002 clip_image003

准备好“Data & synchronization”的章节了么?让我们开始第二个章节吧。

可供参考的实现源代码你可以从这里下载https://github.com/c99koder/lastfm-android/。(在GNUGeneralPublicLicense主题下边)另外一个单独的实例程序你可以从Apache License 2.0主题下得到https://github.com/c99koder/AndroidSyncProviderDemo。Google同样也有一个他们的示例的同步程序在Androiddeveloperportal http://developer.android.com/resources/samples/SampleSyncAdapter/index.html。该应用程序比我(原作者)的会稍微完整一些。



本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/653349,如需转载请自行联系原作者

相关文章
|
16天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
17天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
2天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
2 0
|
2天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
5 0
|
3天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
8天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。
|
10天前
|
XML 移动开发 Android开发
构建高效安卓应用:采用Jetpack Compose实现动态UI
【4月更文挑战第10天】 在现代移动开发中,用户界面的流畅性和响应性对于应用的成功至关重要。随着技术的不断进步,安卓开发者寻求更加高效和简洁的方式来构建动态且吸引人的UI。本文将深入探讨Jetpack Compose这一革新性技术,它通过声明式编程模型简化了UI构建过程,并提升了性能与跨平台开发的可行性。我们将从基本概念出发,逐步解析如何利用Jetpack Compose来创建具有数据动态绑定能力的安卓应用,同时确保应用的高性能和良好用户体验。
14 0
|
11天前
|
监控 API Android开发
构建高效安卓应用:探究Android 12中的新特性与性能优化
【4月更文挑战第8天】 在本文中,我们将深入探讨Android 12版本引入的几项关键技术及其对安卓应用性能提升的影响。不同于通常的功能介绍,我们专注于实际应用场景下的性能调优实践,以及开发者如何利用这些新特性来提高应用的响应速度和用户体验。文章将通过分析内存管理、应用启动时间、以及新的API等方面,为读者提供具体的技术实现路径和代码示例。
|
12天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。