Android文档 - 账户管理器概述
賬戶管理器概述
這個(gè)類提供了訪問到 用戶在線賬戶的集中式注冊(cè)中心 的能力。用戶為每賬戶輸入一次 認(rèn)證信息(credentials,包含用戶名和密碼),過過 點(diǎn)擊一次(one-click)完成認(rèn)證的方式,授權(quán)應(yīng)用程序(app)訪問 在線的資源。不同的服務(wù)具有不同的處理賬戶的認(rèn)證的方式,而 Account Manager 使用了插件化的認(rèn)證器模塊 對(duì)應(yīng)不同的賬戶類型。認(rèn)證器(它由第三方組織編寫)處理 驗(yàn)證賬戶認(rèn)證信息的具體實(shí)際內(nèi)容。并且保存賬戶信息。比如 谷歌,facebook,和微軟每個(gè)都擁有他們自己的認(rèn)證器。許多服務(wù)支持 關(guān)于單一授權(quán)標(biāo)記(authentication token,簡(jiǎn)寫為auth token) 的一些概念,它常常被用于驗(yàn)證 向服務(wù)發(fā)出的不包含真實(shí)密碼的授權(quán)請(qǐng)求。而auth token 常常被創(chuàng)建于獨(dú)立包含用戶認(rèn)證信息(用戶名和密碼)的請(qǐng)求。AccountManager可以為應(yīng)用程序生成認(rèn)證標(biāo)記(auth token),那么應(yīng)用程序不在需要去直接處理密碼。autho token常常可重用和被AccountManager緩存,但是被必須周期性刷新。當(dāng)停止工作的時(shí)候,應(yīng)用程序使得auth token無效化,以讓auth token知道去重新生成它們。 應(yīng)用程序訪問服務(wù)通常通過下面幾個(gè)步驟:
- 獲得一個(gè) AuccountManager的實(shí)例,通過 get(Context)方法。
- 列出可用的賬戶,使用getAccountsByType(String) 或者 getAccountsByTypeAndFeatures(String, String[],AccountManagerCallback, Handler).一般應(yīng)用程序會(huì)對(duì) 一種指定的類型 的賬戶 感興趣,它是認(rèn)證器的標(biāo)識(shí)。賬戶特性被用于標(biāo)識(shí)特定賬戶的子類型和能力。賬戶類型和特性這兩個(gè)是認(rèn)證器規(guī)范字符串,并且必須被應(yīng)用程序所知道,關(guān)于協(xié)調(diào)它們的首選認(rèn)證器。
- 選擇一個(gè)或者多個(gè)可用的賬戶,可能的話詢問用戶他們的偏好。如果沒有匹配的賬戶可以使用,addAccount(String, String, String[], Bundle, Activity, AccountManagerCallback, Handler) 將會(huì)被調(diào)用,提示用戶創(chuàng)建一個(gè)適當(dāng)類型賬戶
- 重要的:如果應(yīng)用正在使用預(yù)先被記憶的賬戶選項(xiàng),它必須確保賬戶仍然存在于一個(gè)被 通過 getAccountsByType(String)返 回的賬戶列表。為一個(gè)賬戶請(qǐng)求一個(gè)認(rèn)證標(biāo)記 不再導(dǎo)致 在設(shè)備結(jié)果中的“一個(gè)未定義的失敗”。
- 使用auth token構(gòu)建請(qǐng)求。auth token的表單,請(qǐng)求的格式,和使用的協(xié)議都特定于你要訪問的服務(wù)。應(yīng)用可以使用任何網(wǎng)絡(luò)和協(xié)議庫(kù)。
- 重要的:如果請(qǐng)求失敗于一個(gè)“授權(quán)錯(cuò)誤”,那么可能 緩存的auth token過期并且不再被服務(wù)端信任。應(yīng)用必須調(diào)用 invalidateAuthToken(String, String)去移除auth token的緩存,另外請(qǐng)求將繼續(xù)失敗! 在使得auth token無效后, 立即返回到上面的“請(qǐng)求一個(gè)auth token”步驟。如果是第二次出處理失敗了,那么它將被當(dāng)做一次誠(chéng)懇的認(rèn)證失敗來對(duì)待并 且通知用戶或做其他適當(dāng)處理。
一些AccountManager方法可能需要與用戶交互,提示用戶認(rèn)證信息,呈現(xiàn)可選項(xiàng),或者詢問用戶去添加賬戶。調(diào)用者可以選擇是否允許AccountManager去直接啟動(dòng)必要的用戶接口并且等待用戶,或者返回一個(gè)intent,它是調(diào)用者可以啟動(dòng)接口。或者一些情況下,安裝一個(gè)通知,它是用戶可以選擇去啟動(dòng)接口。讓AccountManager直接啟動(dòng)接口,調(diào)用者必須提供當(dāng)前 前端的Activity的Context.
?
許多AccountManager方法以 AccountManagerCallback 和 Handler作為參數(shù)。這些方法立即返回并且異步啟動(dòng)。如果一個(gè)回調(diào)被提供,那么run(AccountManagerFuture) 將在Handler的線程上被調(diào)用。結(jié)果被重新取得,是通過 “返回值”AccountManagerFuture 的 getResult()方法(也可以通過回調(diào)方法獲得)。這個(gè)方法等待操作完成(如果需要的話)并且兩者之一:返回結(jié)果或者 在操作過程中發(fā)生錯(cuò)誤拋出異常。要使 請(qǐng)求 同步執(zhí)行,通過方法接收到 future后立即調(diào)用 getResult()即可,不再需要提供回調(diào)。
?
請(qǐng)求可能被阻塞,包括getResult()在內(nèi),必須保證 從不在主線程被調(diào)用。如果在主線程被使用,那些操作將拋出IllegalStateException異常 。
??
****************************************************************************************
AccountManager的常用方法
?
為指定賬戶設(shè)定密碼
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);
?
獲得用戶數(shù)據(jù)
String markerString = mAccountManager.getUserData(account, SYNC_MARKER_KEY);
?
AbstractAccountAuthenticator 概述
這是一個(gè)抽象的基類,用于創(chuàng)建賬戶管理器(AccountAuthenticators)。為了成為一 個(gè) 認(rèn)證器,一個(gè)類必須繼承該類,提供抽象方法的實(shí)現(xiàn),并且寫一個(gè)服務(wù)(service),?
在被ACTION_AUTHENTICATOR_INTENT作為action的intent調(diào)用時(shí),在該服務(wù)的 onBind (android.content.Intent) 方法實(shí)現(xiàn)中,直接返回getIBinder() 的返回值結(jié)果。在?
AndroidManifest.xml 文件中,這個(gè)服務(wù)必須指定下面的 intent過濾器(intent filter )和元數(shù)據(jù)標(biāo)記。
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/authenticator" />
?
譯者注:ACTION_AUTHENTICATOR_INTENT其實(shí)是個(gè)常量,等于字符串 android.accounts.AccountAuthenticator,其實(shí)就是和上面這個(gè)intent filter的過 濾器action相同。
上面的xml描述中,android:resource 屬性必須指向一個(gè)資源文件,像下面這樣:
<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 屬性必須是個(gè)字符串,它唯一標(biāo)識(shí)了你的 認(rèn)證器,并且和 用戶使用AccountManager 調(diào)用時(shí)?
指定的字符串相同,同時(shí) 和你的賬戶類型(account type)一致。 android:icon的一個(gè)使用者是在 “賬戶和同步”設(shè)置頁(yè),android:smallIcon的一個(gè)使用者是在 聯(lián)系人?
應(yīng)用程序的標(biāo)簽面板。
android:accountPreferences屬性指向一個(gè) 首選項(xiàng)屏幕設(shè)置的xml配置文件 (PreferenceScreen xml ),它包含了一個(gè)PreferenceScreen 的列表,可以層級(jí)嵌套。?
它可以被調(diào)用以管理認(rèn)證器。示例如下:
<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>
?
一些抽象方法的標(biāo)準(zhǔn)實(shí)現(xiàn)模式,像下面這樣:
- * 如果為 認(rèn)證器 提供的參數(shù)是足夠的,到達(dá)了完全的滿意,這時(shí)將會(huì)這樣做(will do so )并且返回一個(gè)包含了結(jié)果的Bundle。
- * 如果 認(rèn)證器 需要 從用戶那里收集信息才能達(dá)到滿意,這時(shí),將創(chuàng)建一個(gè)intent打開 “提示用戶信息的activity”,并且完成該請(qǐng)求。這個(gè)intent必須返回一個(gè)包含了 指定key名稱為 KEY_INTENT 的 Bundle.當(dāng)完成的時(shí)候,這個(gè)activity需要返回final修飾的結(jié)果。
這個(gè)intent應(yīng)該使用key指示 KEY_ACCOUNT_MANAGER_RESPONSE來包含AccountAuthenticatorResponse。這個(gè)activity在結(jié)束時(shí)必須調(diào)用 onResult(Bundle) 或者 onError(int, String) 。 - 如果認(rèn)證器不能同步處理請(qǐng)求,并且返回一個(gè)結(jié)果。那么當(dāng)完成請(qǐng)求時(shí),它可以選擇返 回null和使用 AccountManagerResponse 去發(fā)送結(jié)果。
后續(xù)的關(guān)于 每個(gè)抽象認(rèn)證器方法 的描述,將不描述 可能的異步原生請(qǐng)求處理,而將描述輸入?yún)?shù)和期望結(jié)果來替代。
當(dāng)寫一個(gè)activity去滿足那些請(qǐng)求,一種方式,必須在activity關(guān)閉時(shí)(或者任何其他情況下activity的作者認(rèn)為是一個(gè)正確的時(shí)間去響應(yīng)時(shí)),通過 AccountManagerResponse 并且通過響應(yīng)返回結(jié)果。AccountAuthenticatorActivity 用于處理這些,那么當(dāng)寫activity去處理這些請(qǐng)求時(shí),我們可以去繼承(extend) 它。
?
?
?
?
AccountAuthenticatorActivity概述
這是一個(gè)抽象的用于實(shí)現(xiàn)activity的基類,常被用于幫助 抽象認(rèn)證器 (AbstractAccountAuthenticator)的具體實(shí)現(xiàn)(implement)。如果?抽象認(rèn)證器AbstractAccountAuthenticator 需要使用一個(gè)activity去捕獲請(qǐng)求,這是它可以 讓一個(gè)activity來繼承AccountAuthenticatorActivity。?抽象認(rèn)證器AbstractAccountAuthenticator 傳遞響應(yīng)到intent的方法像下面這樣:
? intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);這個(gè) activity設(shè)置(指定)結(jié)果時(shí),結(jié)果(result)被傳遞到響應(yīng)通過?setAccountAuthenticatorResult(android.os.Bundle)?方法。當(dāng)activity結(jié)束時(shí),這個(gè)結(jié)果將被發(fā)送作為 請(qǐng)求的結(jié)果。如果這從未被設(shè)置或者設(shè)置為null,那么 錯(cuò)誤?ERROR_CODE_CANCELED?將會(huì)在響應(yīng)上被調(diào)用。
?
譯者注:??賬戶認(rèn)證器通過intent調(diào)用 這個(gè)activity,通過intent傳遞參數(shù):
intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); 傳遞一個(gè) 賬戶認(rèn)證器響應(yīng)到 這個(gè)activity,作為參數(shù),而這個(gè)activity將處理具體實(shí)現(xiàn),處理完畢后,使用?setAccountAuthenticatorResult(android.os.Bundle) 來設(shè)置處理的結(jié)果。
AccountManagerFuture概述
一個(gè)AccountManagerFuture 表現(xiàn)了 異步的AccountManager調(diào)用的結(jié)果。它提供了一些方法用于判斷計(jì)算是否完成,等待計(jì)算過程,和獲得運(yùn)算結(jié)果。當(dāng)運(yùn)算完成后,阻塞(如果需要的話)知道結(jié)果被準(zhǔn)備好,結(jié)果只能被使用 get 方法獲得。取消操作將被 cancel方法處理。額外的方法被提供為判斷任務(wù)被正常完成或者被取消。一旦一個(gè)運(yùn)算被完成,運(yùn)算就不能被取消了。如果你為了可以取消的意圖而不提供一個(gè)有用的結(jié)果的方式 來使用這個(gè)類,你可以聲明 類似格式?Future<?> 的類型并且返回null作為相關(guān)任務(wù)的結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的Android文档 - 账户管理器概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 进制问题
- 下一篇: 关于Android Fragment基础