0

首先,動機之內:等待getAuthToken意圖結果的服務

我建立,可以從中受益的應用程序,但並不絕對要求,通過AccountManager獲得Android服務。既然如此,我已經構建了我的應用程序,但沒有使用GET_ACCOUNTSUSE_CREDENTIALS權限,而是選擇構建Service授權插件,用戶可以選擇安裝該插件。現在,這個插件完全按照預期工作,除了一個明顯的問題:我可以開始從getAuthToken(...)返回的Intent要求初始授權,但我不能等待它完成。

所以,現在它被稱爲我爲什麼要叫getAuthToken(...)ServiceActivity代替,沒有人知道我可以等待授權Intent返回令牌之前完成?基本上,在下面的代碼中,有沒有人知道如何延遲返回token直到authIntent完成?

... 
AccountManagerFuture<Bundle> accountManagerFuture; 
accountManagerFuture = accountManager.getAuthToken(accounts[0], "android", true, null, null); 
Bundle authTokenBundle = accountManagerFuture.getResult(); 
if (authTokenBundle.containsKey(AccountManager.KEY_AUTHTOKEN)) 
    token = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString(); 
else if (authTokenBundle.containsKey(AccountManager.KEY_INTENT)) { 
    Intent authIntent = (Intent) authTokenBundle.getParcelable(AccountManager.KEY_INTENT); 
    authIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(authIntent); 
    ... 
    // I know that I wouldn't set token here; this is just to emphasize 
    // that I want to set it after authIntent completes 
    token = ??? 
} 

此外,如果有任何用途需要知道,上面的代碼位於AsyncTask之內。這將是醜陋的,但也許我可以輪詢getAuthToken(...),直到它不再返回Intent?不過,我必須相信還有比這更好的解決方案。

回答

0

這不是最好的答案,我敢肯定,但我認爲它應該適用於我的具體情況。即,以下限制適用:

  1. Service插件僅用於與父應用程序接口。
  2. 父應用程序不會連續調用插件。
  3. getAuthToken(...)返回的授權Intent很少被調用(可能只有一次)。
  4. getAuthToken(...)運行Intent後,後續調用將返回有效令牌(如果用戶授予權限)或無效令牌(如果用戶未授予權限)。
  5. 當授權提示出現時,父應用程序暫停。

鑑於上述所有情況,我認爲我可以在授權提示獲得焦點時在父應用程序的onPause()中調用unbindService(...)。授權提示完成後,我可以撥打,然後在隨後的時間調用與getAuthToken(...)關聯的任務。此時,由於授權提示已經被應用(假設正常的用戶交互),父應用將獲得(有效或無效)令牌,就好像Service已經等待Intent完成一樣。

我可以用這種方法看到的問題涉及到用戶沒有首先終止授權Intent帶回父應用程序。我還沒有測試過這種情況,但是會懷疑很大程度上取決於getAuthToken(...)如何確定何時返回Intent

無論如何,這就是我得到的。任何其他建議/關注都會受到歡迎。