一種提高Android應用進程存活率新方法(下)
作者:佚名
Android系統(tǒng)內(nèi)存不足時,系統(tǒng)會殺掉一部分進程以釋放空間,誰生誰死的這個生死大權就是由LMK所決定的,這就是Android系統(tǒng)中的Low Memory Killer,其基于Linux的OOM機制,其閾值定義如下面所示的lowmemorykiller文件中,當然也可以通過系統(tǒng)的init.rc實現(xiàn)自定義。
接上文
- 創(chuàng)建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客戶端后臺?;罱?jīng)驗分享
- 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篇從底層實現(xiàn)讓進程不被殺死(失效Closed)
- Android 4.3+ NotificationListenerService 的使用
- Going multiprocess on Android
責任編輯:龐桂玉
來源:
安卓開發(fā)精選