Android文档 - 账户管理器概述
账户管理器概述
这个类提供了访问到 用户在线账户的集中式注册中心 的能力。用户为每账户输入一次 认证信息(credentials,包含用户名和密码),过过 点击一次(one-click)完成认证的方式,授权应用程序(app)访问 在线的资源。不同的服务具有不同的处理账户的认证的方式,而 Account Manager 使用了插件化的认证器模块 对应不同的账户类型。认证器(它由第三方组织编写)处理 验证账户认证信息的具体实际内容。并且保存账户信息。比如 谷歌,facebook,和微软每个都拥有他们自己的认证器。
许多服务支持 关于单一授权标记(authentication token,简写为auth token) 的一些概念,它常常被用于验证 向服务发出的不包含真实密码的授权请求。而auth token 常常被创建于独立包含用户认证信息(用户名和密码)的请求。AccountManager可以为应用程序生成认证标记(auth token),那么应用程序不在需要去直接处理密码。autho token常常可重用和被AccountManager缓存,但是被必须周期性刷新。当停止工作的时候,应用程序使得auth token无效化,以让auth token知道去重新生成它们。 应用程序访问服务通常通过下面几个步骤:
- 获得一个 AuccountManager的实例,通过 get(Context)方法。
- 列出可用的账户,使用getAccountsByType(String) 或者 getAccountsByTypeAndFeatures(String, String[],AccountManagerCallback, Handler).一般应用程序会对 一种指定的类型 的账户 感兴趣,它是认证器的标识。账户特性被用于标识特定账户的子类型和能力。账户类型和特性这两个是认证器规范字符串,并且必须被应用程序所知道,关于协调它们的首选认证器。
- 选择一个或者多个可用的账户,可能的话询问用户他们的偏好。如果没有匹配的账户可以使用,addAccount(String, String, String[], Bundle, Activity, AccountManagerCallback, Handler) 将会被调用,提示用户创建一个适当类型账户
- 重要的:如果应用正在使用预先被记忆的账户选项,它必须确保账户仍然存在于一个被 通过 getAccountsByType(String)返 回的账户列表。为一个账户请求一个认证标记 不再导致 在设备结果中的“一个未定义的失败”。
- 使用auth token构建请求。auth token的表单,请求的格式,和使用的协议都特定于你要访问的服务。应用可以使用任何网络和协议库。
- 重要的:如果请求失败于一个“授权错误”,那么可能 缓存的auth token过期并且不再被服务端信任。应用必须调用 invalidateAuthToken(String, String)去移除auth token的缓存,另外请求将继续失败! 在使得auth token无效后, 立即返回到上面的“请求一个auth token”步骤。如果是第二次出处理失败了,那么它将被当做一次诚恳的认证失败来对待并 且通知用户或做其他适当处理。
一些AccountManager方法可能需要与用户交互,提示用户认证信息,呈现可选项,或者询问用户去添加账户。调用者可以选择是否允许AccountManager去直接启动必要的用户接口并且等待用户,或者返回一个intent,它是调用者可以启动接口。或者一些情况下,安装一个通知,它是用户可以选择去启动接口。让AccountManager直接启动接口,调用者必须提供当前 前端的Activity的Context.
许多AccountManager方法以 AccountManagerCallback 和 Handler作为参数。这些方法立即返回并且异步启动。如果一个回调被提供,那么run(AccountManagerFuture) 将在Handler的线程上被调用。结果被重新取得,是通过 “返回值”AccountManagerFuture 的 getResult()方法(也可以通过回调方法获得)。这个方法等待操作完成(如果需要的话)并且两者之一:返回结果或者 在操作过程中发生错误抛出异常。要使 请求 同步执行,通过方法接收到 future后立即调用 getResult()即可,不再需要提供回调。
请求可能被阻塞,包括getResult()在内,必须保证 从不在主线程被调用。如果在主线程被使用,那些操作将抛出IllegalStateException异常 。
****************************************************************************************
AccountManager的常用方法
为指定账户设定密码
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);
AbstractAccountAuthenticator 概述
这是一个抽象的基类,用于创建账户管理器(AccountAuthenticators)。为了成为一 个 认证器,一个类必须继承该类,提供抽象方法的实现,并且写一个服务(service),
在被ACTION_AUTHENTICATOR_INTENT作为action的intent调用时,在该服务的 onBind (android.content.Intent) 方法实现中,直接返回getIBinder() 的返回值结果。在
AndroidManifest.xml 文件中,这个服务必须指定下面的 intent过滤器(intent filter )和元数据标记。
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
译者注:ACTION_AUTHENTICATOR_INTENT其实是个常量,等于字符串 android.accounts.AccountAuthenticator,其实就是和上面这个intent filter的过 滤器action相同。
上面的xml描述中,android:resource 属性必须指向一个资源文件,像下面这样:
<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"
/>
使用你自己的资源替换 icon 和 label 属性指向的值。android:accountType 属性必须是个字符串,它唯一标识了你的 认证器,并且和 用户使用AccountManager 调用时
指定的字符串相同,同时 和你的账户类型(account type)一致。 android:icon的一个使用者是在 “账户和同步”设置页,android:smallIcon的一个使用者是在 联系人
应用程序的标签面板。
android:accountPreferences属性指向一个 首选项屏幕设置的xml配置文件 (PreferenceScreen xml ),它包含了一个PreferenceScreen 的列表,可以层级嵌套。
它可以被调用以管理认证器。示例如下:
<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>
一些抽象方法的标准实现模式,像下面这样:
- * 如果为 认证器 提供的参数是足够的,到达了完全的满意,这时将会这样做(will do so )并且返回一个包含了结果的Bundle。
- * 如果 认证器 需要 从用户那里收集信息才能达到满意,这时,将创建一个intent打开 “提示用户信息的activity”,并且完成该请求。这个intent必须返回一个包含了 指定key名称为 KEY_INTENT 的 Bundle.当完成的时候,这个activity需要返回final修饰的结果。
这个intent应该使用key指示 KEY_ACCOUNT_MANAGER_RESPONSE来包含AccountAuthenticatorResponse。这个activity在结束时必须调用 onResult(Bundle) 或者 onError(int, String) 。
- 如果认证器不能同步处理请求,并且返回一个结果。那么当完成请求时,它可以选择返 回null和使用 AccountManagerResponse 去发送结果。
后续的关于 每个抽象认证器方法 的描述,将不描述 可能的异步原生请求处理,而将描述输入参数和期望结果来替代。
当写一个activity去满足那些请求,一种方式,必须在activity关闭时(或者任何其他情况下activity的作者认为是一个正确的时间去响应时),通过 AccountManagerResponse 并且通过响应返回结果。AccountAuthenticatorActivity 用于处理这些,那么当写activity去处理这些请求时,我们可以去继承(extend) 它。
AccountAuthenticatorActivity概述
这是一个抽象的用于实现activity的基类,常被用于帮助 抽象认证器 (AbstractAccountAuthenticator)的具体实现(implement)。如果 抽象认证器AbstractAccountAuthenticator 需要使用一个activity去捕获请求,这是它可以 让一个activity来继承AccountAuthenticatorActivity。 抽象认证器AbstractAccountAuthenticator 传递响应到intent的方法像下面这样:
intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE
, response);
这个 activity设置(指定)结果时,结果(result)被传递到响应通过 setAccountAuthenticatorResult(android.os.Bundle) 方法。当activity结束时,这个结果将被发送作为 请求的结果。如果这从未被设置或者设置为null,那么 错误 ERROR_CODE_CANCELED 将会在响应上被调用。
译者注: 账户认证器通过intent调用 这个activity,通过intent传递参数:
intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE
, response); 传递一个 账户认证器响应到 这个activity,作为参数,而这个activity将处理具体实现,处理完毕后,使用
setAccountAuthenticatorResult(android.os.Bundle) 来设置处理的结果。
AccountManagerFuture概述
一个AccountManagerFuture 表现了 异步的AccountManager调用的结果。它提供了一些方法用于判断计算是否完成,等待计算过程,和获得运算结果。当运算完成后,阻塞(如果需要的话)知道结果被准备好,结果只能被使用 get 方法获得。取消操作将被 cancel方法处理。额外的方法被提供为判断任务被正常完成或者被取消。一旦一个运算被完成,运算就不能被取消了。如果你为了可以取消的意图而不提供一个有用的结果的方式 来使用这个类,你可以声明 类似格式 Future<?> 的类型并且返回null作为相关任务的结果。
Android文档 - 账户管理器概述的更多相关文章
- Atitit 文档资料管理同步解决方案
Atitit 文档资料管理同步解决方案 流程 生成快照, 操作. 使用快照与dir对比,生成操作日志 /atiplat_cms/src/com/attilax/sync/SyncUtil.java p ...
- 解决本地访问Android文档是非常慢的问题
不时在天上不能上网Android开发站点.要查看开发者文档,真是费劲心思,这里不再介绍访问Android开发网站developer.android.com,这里介绍怎样高速的訪问打开本地的SDK下An ...
- sharepoint 2013 文档库 资源管理器打开报错 在文件资源管理器中打开此位置时遇到问题,将此网站添加到受信任站点列表,然后重试。
我们在使用sharepoint 2013的文档库或者资源库的时候,经常会需要用到使用“资源管理器”来管理文档,但是有时候,点击“使用资源管理器打开”,会提示如下错误: 在文件资源管理器中打开此位置时遇 ...
- 【软件project】 文档 - 银行业务管理 - 需求分析
---------------------------------------------------------------------------------------------------- ...
- Android文档资源大放送 感兴趣的话可以网盘下载(个人收集)
Google.Android.SDK开发范例大全.第3版源码.rar http://pan.baidu.com/s/1c0epYzm 精通Android 3中文版(Pro Android 3).pdf ...
- Linux命令学习之路——文档权限管理:chmod
使用权限:所有角色 使用方式:chmod [ -cfvR ] [ --help ] [ --version ] mode file... 作用:该命令用于在Linux中管理和变更角色对文档的存取权限 ...
- supervisor安装部署文档和管理实例
Supervisord是用Python实现的一款非常实用的进程管理工具,类似于monit(关于monit见我的博客:用monit监控系统关键进程),monit和supervisord的一个比较大的差异 ...
- 学习android文档 -- Adding the Action Bar
1. Setting Up the Action Bar:users-sdk version 11以上可以使用holo主题:如果不使用holo主题,或者sdk版本较低,则需要在manifest文件的& ...
- WORD文档书签管理
最近在浏览一个word超长文档,在文档中有几处要点用颜色做了标记,但是在下次查找的时候无法定位,还得一页页去翻,而且无法通过目录概览的形式查看总共做了多少处标记 于是想到了书签 原本以为在视图中能够设 ...
随机推荐
- jota-time 练习
public static void main(String[] args) { LocalDate now = new LocalDate(); //输出形式为yyyy-MM-dd System.o ...
- php使用CURL不依赖COOKIEJAR获取COOKIE的方法
本文实例讲述了php使用CURL不依赖COOKIEJAR获取COOKIE的方法.分享给大家供大家参考.具体分析如下: PHP中CURL类是一个非常牛逼的工具类,具体怎么牛逼就不啰嗦了. 对于COOKI ...
- unity, Animator.ResetTrigger
解: 正确的写法应该是:Animator.SetTrigger("unfoldTrigger")Animator.ResetTrigger("unfoldTrigger& ...
- 本地启动spark-shell
由于spark-1.3作为一个里程碑式的发布, 加入众多的功能特性,所以,有必要好好的研究一把,spark-1.3需要scala-2.10.x的版本支持,而系统上默认的scala的版本为2.9,需要进 ...
- 分布式服务管理框架-Zookeeper节点ACL
文章转自:http://blog.csdn.net/xyang81/article/details/53147894 概述 ACL全称为Access Control List(访问控制列表),用于控制 ...
- 实现session(session数据)的共享,解决分布式session共享
为什么要实现共享? 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 ...
- 处理 ASP.NET 中的异常:无法在发送 HTTP 标头之后进行重定向。
因为在 Global.asax 中的 Application_Error 事件中添加了统一的错误处理,其中会有 Redirect 重定向到错误页面. 但是有可能有些情况下已经进行过其它重定向操作,所以 ...
- Android 应用架构 - Google 推荐
Android 应用框架,一般都是使用的 MVC ,MVP ,MVVM 框架,目前 Google 推出了 Android 官方的应用框架. 用到的关键内容: LiveData, ViewModel, ...
- sql的split()函数
ALTER function [dbo].[StrToList_Test](@Str varchar()) returns @table table( value nvarchar(max) ) as ...
- memory-based 协同过滤(CF)方法
协同过滤(collaborative filtering,CF)算法主要分为memory-based CF 和 model-based CF,而memory-based CF 包括user-based ...