专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
郭霖  ·  Android振动分析:从App层到HAL层 ·  2 天前  
郭霖  ·  Android音视频基础能力之音频路由 ·  3 天前  
鸿洋  ·  系统Apk、普通Apk、core ... ·  2 天前  
鸿洋  ·  一波深入的Android 性能优化 ·  3 天前  
郭霖  ·  activityGuard:Android ... ·  4 天前  
51好读  ›  专栏  ›  安卓开发精选

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

安卓开发精选  · 公众号  · android  · 2016-12-25 22:16

正文

(点击上方公众号,可快速关注)


来源:伯乐在线专栏作者 - skyseraph

链接:http://android.jobbole.com/85286/

点击 → 了解如何加入专栏作者


接上文


  • 创建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



关注「安卓开发精选」

看更多精选安卓技术文章

↓↓↓