接上文
- 创建Account服务
- public class XXAuthService extends Service {
- private XXAuthenticator mAuthenticator;
- @Override
- public void onCreate() {
- mAuthenticator = new XXAuthenticator(this);
- }
- private XXAuthenticator getAuthenticator() {
- if (mAuthenticator == null)
- mAuthenticator = new XXAuthenticator(this);
- return mAuthenticator;
- }
- @Override
- public IBinder onBind(Intent intent) {
- return getAuthenticator().getIBinder();
- }
- class XXAuthenticator extends AbstractAccountAuthenticator {
- private final Context context;
- private AccountManager accountManager;
- public XXAuthenticator(Context context) {
- super(context);
- this.context = context;
- accountManager = AccountManager.get(context);
- }
- @Override
- public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options)
- throws NetworkErrorException {
- // 添加账号 示例代码
- final Bundle bundle = new Bundle();
- final Intent intent = new Intent(context, AuthActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- bundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return bundle;
- }
- @Override
- public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options)
- throws NetworkErrorException {
- // 认证 示例代码
- String authToken = accountManager.peekAuthToken(account, getString(R.string.account_token_type));
- //if not, might be expired, register again
- if (TextUtils.isEmpty(authToken)) {
- final String password = accountManager.getPassword(account);
- if (password != null) {
- //get new token
- authToken = account.name + password;
- }
- }
- //without password, need to sign again
- final Bundle bundle = new Bundle();
- if (!TextUtils.isEmpty(authToken)) {
- bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
- bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
- bundle.putString(AccountManager.KEY_AUTHTOKEN, authToken);
- return bundle;
- }
- //no account data at all, need to do a sign
- final Intent intent = new Intent(context, AuthActivity.class);
- intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
- intent.putExtra(AuthActivity.ARG_ACCOUNT_NAME, account.name);
- bundle.putParcelable(AccountManager.KEY_INTENT, intent);
- return bundle;
- }
- @Override
- public String getAuthTokenLabel(String authTokenType) {
- // throw new UnsupportedOperationException();
- return null;
- }
- @Override
- public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- return null;
- }
- @Override
- public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options)
- throws NetworkErrorException {
- return null;
- }
- @Override
- public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options)
- throws NetworkErrorException {
- return null;
- }
- @Override
- public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features)
- throws NetworkErrorException {
- return null;
- }
- }
- }
- 声明Account服务
- <service
- android:name="**.XXAuthService"
- android:exported="true"
- android:process=":core">
- <intent-filter>
- <action
- android:name="android.accounts.AccountAuthenticator"/>
- </intent-filter>
- <meta-data
- android:name="android.accounts.AccountAuthenticator"
- android:resource="@xml/authenticator"/>
- </service>
其中authenticator为:
- <?xml version="1.0" encoding="utf-8"?>
- <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
- android:accountType="@string/account_auth_type"
- android:icon="@drawable/icon"
- android:smallIcon="@drawable/icon"
- android:label="@string/app_name"
- />
- 使用Account服务
同SyncAdapter,通过AccountManager使用
。申请Token主要是通过 AccountManager.getAuthToken)系列方法
。添加账号则通过 AccountManager.addAccount)
。查看是否存在账号通过 AccountManager.getAccountsByType)
Refs
- 微信Android客户端后台保活经验分享
- Android Low Memory Killer原理
- stackOverflow 上介绍的双Service方法
- Write your own Android Sync Adapter
- Write your own Android Authenticator
- Android developer
- android.accounts
- AccountManager
- AbstractAccountAuthenticator
- AccountAuthenticatorActivity
- Creating a Sync Adapter
- Android篇从底层实现让进程不被杀死(失效Closed)
- Android 4.3+ NotificationListenerService 的使用
- Going multiprocess on Android