博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种提高Android应用进程存活率新方法(下)
阅读量:6196 次
发布时间:2019-06-21

本文共 4192 字,大约阅读时间需要 13 分钟。

接上文

  • 创建
  • 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
本文作者:佚名
来源:51CTO

转载地址:http://ebfca.baihongyu.com/

你可能感兴趣的文章
快捷创建H-v虚拟机
查看>>
python版春节倒计时实时显示
查看>>
Skype for Business Server 2015-11-Web Application Proxy-部署
查看>>
(译)如何使用cocos2d来制作一个塔防游戏:第一部分
查看>>
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
查看>>
Penetration test
查看>>
hive的查询注意事项以及优化总结 .
查看>>
CMD魔法堂:支持显示UTF8编码的中文
查看>>
【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)
查看>>
机器学习技法--学习笔记03--Kernel技巧
查看>>
Android中Webview使用自定义的javascript进行回调
查看>>
[Everyday Mathematics]20150124
查看>>
用Quartus II Timequest Timing Analyzer进行时序分析 :实例讲解 (一)
查看>>
深入分析C++引用
查看>>
计算机网络各层协议
查看>>
[Angular 2] Dispatching Action with Payloads and type to Reducers
查看>>
getconf 命令
查看>>
图片预览
查看>>
android蓝牙4.0(BLE)开发之ibeacon初步
查看>>