转载

一种提高Android应用进程存活率新方法(下)

一种提高Android应用进程存活率新方法(下)

接上文

  • 创建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
原文  http://mobile.51cto.com/android-526132.htm
正文到此结束
Loading...