[[179903]] Continued from previous article - 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 {
- // Add account sample code
- 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 {
- // Authentication sample code
- 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 ;
- }
- }
- }
- <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>
The authenticator is: - <?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"
- />
Same as SyncAdapter, used through AccountManager Token application is mainly through AccountManager.getAuthToken) series of methods . Adding an account is done through AccountManager.addAccount) . Check if the account exists through AccountManager.getAccountsByType) Refs - WeChat Android client background keep alive experience sharing
- Android Low Memory Killer Principle
- The dual service method introduced on stackOverflow
- Write your own Android Sync Adapter
- Write your own Android Authenticator
- Android developer
- android.accounts
- AccountManager
- AbstractAccountAuthenticator
- AccountAuthenticatorActivity
- Creating a Sync Adapter
- Android article: Implementing from the bottom layer to prevent the process from being killed (failed Closed)
- Use of NotificationListenerService in Android 4.3+
- Going multiprocess on Android
|