我应该将Android AccountManager用于什么?


154

我已经在Android SDK中看到了AccountManager,它用于存储帐户信息。因此,我找不到任何针对其用途的一般性讨论。有人知道AccountManager的目的是什么以及它能给您带来什么好处吗?对于适合哪种类型的帐户有任何意见?您将在这里放置用于一般Web服务的用户帐户信息吗?


请注意,我的目标是2.1及更高版本,因此如果明智的选择,我可以使用AccountManager
Phil,2010年

7
有一个关于这个帖子这个问题部分:udinic.wordpress.com/2013/04/24/...
Udinic

@Udinic-谢谢。很多帮助!
乍得宾厄姆

此主题在以下网站中处理:www.digigene.com/android/accounts-in-android/
Ali Nem

也有在Android的帐户管理库在这里
阿里·尼姆

Answers:


94

这个问题有点老了,但我认为仍然很感兴趣。

AccountManagerSyncAdapter然后ContentProvider一起去。

但是你可以:

AccountManager/ SyncAdapter/ContentProvider

  • AccountManager 为用户提供一个中心点(“设置”>“帐户”)以定义其凭据
  • Android决定何时可以通过进行同步SyncAdapter。这可以优化电池电量(例如,当网络中断时不进行同步)
  • ContentProvider是跨应用程序共享数据的便捷方法。注意:Android上还有其他进程间通信方法
  • ContentProvider安排在后台数据库访问线程AsyncQueryHanlder帮助查询ContentProvider在后台线程,防止应用程序没有响应(ANR)错误,同时不要求你明确地处理线程。
  • ContentProviderContentResolver的观察者相关联:这意味着在更改内容时很容易通知视图

底线:框架AccountManager/ SyncAdapter/ ContentProvider帮助,如果你想将数据从一个网络资源同步。API 7要求使用伪造/ 哑巴实现

  • 如果只想存储数据,则应考虑一种更简单的数据存储机制
  • 如果您只需要获取唯一资源,则可以使用 AsyncTaskLoader
  • 如果要异步加载图像,则可以使用特殊的库,例如Square Picasso
  • 如果您只想在给定的时间执行一些代码,则可以考虑“服务/警报”
  • 仅可从API> = 7获得(这不再重要)

最后,如果您使用SyncAdapter,请认真考虑Firebase Cloud Messaging(以前称为Google Cloud Messaging)又名“推送通知”,以获取更新的更新和优化的电池使用情况。


1
在SDK示例中,AccountAuthentificatorActivity是唯一可选的部分。
rds

我还不熟悉这些类,但是这些类是否可以在没有用户交互的情况下添加带有函数调用的帐户?例如,添加一个Microsoft Exchange帐户,Google帐户,POP3 / IMAP帐户。谢谢。
dackyD 2012年

@dackyD是的,您可以通过编程
rds

谢谢@rds,但是根据您的解释,示例代码似乎还不够。似乎我也需要实现SyncAdapter和ContentProvider才能实现我的目标。纠正我,如果我错了:)
dackyD 2012年

完全正确。这是我第一段的意思,它们在一起,没有其他部分就无法使用。
rds 2012年

23

AccountManager类与您的电话帐户集成在一起。因此,如果您遵循所有指南并使其正常运行,您将在“设置->帐户和同步”菜单下看到您的帐户。从那里您可以自定义它们,甚至删除它们。此外,accountManager拥有您帐户的身份验证票证的缓存。如果您不打算同步帐户(据我所知),也可以使用此功能。

如果您不希望帐户显示在该菜单下,则不应使用AccountManager并将帐户数据存储在其他位置(也许在共享首选项中)http://developer.android.com/guide/topics/data/data -storage.html


14

http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/

难题的第一部分称为帐户身份验证器,它定义了用户的帐户在“帐户和同步”设置中的显示方式。实施帐户身份验证器需要三部分:从onBind方法返回AbstractAccountAuthenticator的子类的服务,提示用户输入其凭据的活动以及描述您的帐户在显示给用户时的外观的xml文件。您还需要向您的AndroidManifest.xml添加android.permission.AUTHENTICATE_ACCOUNTS权限。


3
那是一篇很好的文章,但是您认为AccountManager仅适用于同步联系人和电子邮件的帐户,还是可以/应该将它用于具有用户ID和密码的任何内容?
Phil

@Phil:我从没使用过AccountManager,所以我不能告诉你。请记住,它是随2.0一起提供的,因此,如果您希望在具有较低SDK的设备上运行,则必须寻找另一种方式来处理登录。
Macarse

6
您可以将帐户管理器用于任何类型的帐户,以任何方式同步存储的任何类型的数据。请查看github.com/maxpower47/PinDroid,以获取使用该示例将书签同步到sqlite数据库的示例。
maxpower47 2011年

7

AccountManager优点在于以下几个方面:

  • 首先是在一个帐户类型下存储多个帐户名称,这些帐户名称对应用程序功能的访问级别不同。例如,在视频流应用程序中,一个可以具有两个帐户名:一个可以对有限数量的视频进行演示访问,另一个可以对所有视频进行全月访问。Accounts但是,这不是使用它的主要原因,因为您可以轻松地在应用程序中进行管理,而无需花哨的Accounts东西…。
  • 使用的另一个好处Accounts是,每次用户请求授权功能时,都无需使用用户名和密码来进行传统授权,因为身份验证是在后台进行的,并且仅在特定条件下才要求用户输入密码,因此稍后再说。
  • Accounts在android中使用该功能还无需定义自己的帐户类型。您可能使用Google帐户进行授权时遇到了这些应用程序,这省去了创建新帐户并为用户记住其凭据的麻烦。
  • Accounts 可以通过设置→帐户独立添加
  • 使用可以轻松管理跨平台用户授权Accounts。例如,客户端可以在其android设备和PC中同时访问受保护的资料,而无需重复登录。
  • 从安全的角度来看,在对服务器的每个请求中使用相同的密码可以窃听非安全连接。此处密码加密不足以防止密码被盗。
  • 最后,Accounts在android中使用该功能的重要原因是,在Accounts不损害客户端(用户)凭据的情况下,将与所涉及的任何业务相关的双方(称为身份验证者和资源所有者)分开。这些术语可能看起来比较模糊,但是在您阅读以下段落之前,请不要放弃……😉

让我用一个视频流应用程序的例子来详细说明后者。公司A是与公司B签订合同的视频流媒体业务的所有者,以为其某些成员提供高级流媒体服务。公司B使用用户名和密码方法来识别其用户。为了使A公司认识到B的高级会员,一种方法是从B获得他们的名单,并利用类似的用户名/密码匹配机制。这样,身份验证者和资源所有者是相同的(公司A)。除了用户必须记住第二个密码的义务外,他们很有可能使用与公司B的配置文件相同的密码来使用来自A的服务。这显然是不利的。

为了消除上述缺点,引入了OAuth。作为授权的开放标准,在上面的示例中,OAuth要求由B公司(身份验证者)进行授权,方法是向符合条件的用户(第三方)发出称为访问令牌的令牌,然后向A公司(资源所有者)提供令牌。因此,没有令牌就意味着没有资格。

我已经对此进行了详细说明,并AccountManager在我的网站上进行了详细说明

这是一个使用AccountManager的简单应用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.