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

移动开发 Android
Android系统内存不足时,系统会杀掉一部分进程以释放空间,谁生谁死的这个生死大权就是由LMK所决定的,这就是Android系统中的Low Memory Killer,其基于Linux的OOM机制,其阈值定义如下面所示的lowmemorykiller文件中,当然也可以通过系统的init.rc实现自定义。

[[179903]]

接上文

  • 创建Account服务
  1. public class XXAuthService extends Service { 
  2.     private XXAuthenticator mAuthenticator; 
  3.   
  4.     @Override 
  5.     public void onCreate() { 
  6.         mAuthenticator = new XXAuthenticator(this); 
  7.     } 
  8.   
  9.     private XXAuthenticator getAuthenticator() { 
  10.         if (mAuthenticator == null
  11.             mAuthenticator = new XXAuthenticator(this); 
  12.         return mAuthenticator; 
  13.     } 
  14.   
  15.     @Override 
  16.     public IBinder onBind(Intent intent) { 
  17.         return getAuthenticator().getIBinder(); 
  18.     } 
  19.   
  20.     class XXAuthenticator extends AbstractAccountAuthenticator { 
  21.         private final Context context; 
  22.         private AccountManager accountManager; 
  23.         public XXAuthenticator(Context context) { 
  24.             super(context); 
  25.             this.context = context; 
  26.             accountManager = AccountManager.get(context); 
  27.         } 
  28.   
  29.         @Override 
  30.         public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) 
  31.                 throws NetworkErrorException { 
  32. // 添加账号 示例代码 
  33.             final Bundle bundle = new Bundle(); 
  34.             final Intent intent = new Intent(context, AuthActivity.class); 
  35.             intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); 
  36.             bundle.putParcelable(AccountManager.KEY_INTENT, intent); 
  37.             return bundle; 
  38.         } 
  39.   
  40.         @Override 
  41.         public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) 
  42.                 throws NetworkErrorException { 
  43. // 认证 示例代码 
  44.             String authToken = accountManager.peekAuthToken(account, getString(R.string.account_token_type)); 
  45.             //if not, might be expired, register again 
  46.             if (TextUtils.isEmpty(authToken)) { 
  47.                 final String password = accountManager.getPassword(account); 
  48.                 if (password != null) { 
  49.                     //get new token 
  50. authToken = account.name + password
  51.                 } 
  52.             } 
  53.             //without password, need to sign again 
  54.             final Bundle bundle = new Bundle(); 
  55.             if (!TextUtils.isEmpty(authToken)) { 
  56.                 bundle.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); 
  57.                 bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); 
  58.                 bundle.putString(AccountManager.KEY_AUTHTOKEN, authToken); 
  59.                 return bundle; 
  60.             } 
  61.   
  62.             //no account data at all, need to do a sign 
  63.             final Intent intent = new Intent(context, AuthActivity.class); 
  64.             intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); 
  65.             intent.putExtra(AuthActivity.ARG_ACCOUNT_NAME, account.name); 
  66.             bundle.putParcelable(AccountManager.KEY_INTENT, intent); 
  67.             return bundle; 
  68.         } 
  69.   
  70.         @Override 
  71.         public String getAuthTokenLabel(String authTokenType) { 
  72. //            throw new UnsupportedOperationException(); 
  73.             return null
  74.         } 
  75.   
  76.         @Override 
  77.         public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { 
  78.             return null
  79.         } 
  80.   
  81.         @Override 
  82.         public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) 
  83.                 throws NetworkErrorException { 
  84.             return null
  85.         } 
  86.   
  87.         @Override 
  88.         public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) 
  89.                 throws NetworkErrorException { 
  90.             return null
  91.         } 
  92.   
  93.         @Override 
  94.         public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) 
  95.                 throws NetworkErrorException { 
  96.             return null
  97.         } 
  98.     } 

 

  • 声明Account服务
  1. <service 
  2. android:name="**.XXAuthService" 
  3. android:exported="true" 
  4. android:process=":core"
  5. <intent-filter> 
  6. <action 
  7. android:name="android.accounts.AccountAuthenticator"/> 
  8. </intent-filter> 
  9. <meta-data 
  10. android:name="android.accounts.AccountAuthenticator" 
  11. android:resource="@xml/authenticator"/> 
  12. </service> 

 

其中authenticator为:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:accountType="@string/account_auth_type" 
  4.     android:icon="@drawable/icon" 
  5.     android:smallIcon="@drawable/icon" 
  6.     android:label="@string/app_name" 
  7. /> 

 

  • 使用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
责任编辑:庞桂玉 来源: 安卓开发精选
相关推荐

2016-12-26 18:25:29

Android应用进程存活率

2022-04-20 08:00:00

深度学习数据集Hub

2022-11-22 11:18:38

Java虚拟线程

2022-03-10 12:16:14

侧信道内存攻击网络攻击

2021-02-18 18:13:34

LinuxARM树莓派

2018-10-07 07:00:59

2023-08-08 11:28:06

企业首席执行官

2021-09-26 10:49:27

计算机互联网 技术

2021-09-27 10:12:42

欺骗防御rMTD网络攻击

2019-11-23 23:18:20

物联网存活率企业

2010-04-01 09:30:57

2015-08-21 09:14:40

大数据

2022-05-26 10:57:51

机器人人工智能

2021-02-18 14:55:06

FuchsiaAndroidLinux

2019-07-12 13:50:36

物联网大数据安全

2022-07-07 10:47:16

IngressKubernetes

2024-04-08 12:18:57

训练AI

2014-02-27 10:08:13

Pipelight浏览器插件

2021-04-26 23:31:49

黑客漏洞网络攻击

2009-07-31 08:56:59

ASP.NET页面刷新
点赞
收藏

51CTO技术栈公众号