一般来说,android的一些耗时的操作很多都会丢给后台服务来做,而一些公司因为安全原因,再每次请求的网络的时候请求头会隔一段时间变化一次,但是也不能每次请求网络都去拿一次请求头,所以这个时候在service后台定时请求网络获取最新的请求头然后储存起来是很有必要的,
下面直接贴代码,记录一下
- public static final String TAG = "TokenService";
- private static boolean control = false;
- private TokenBean mTokenBean;
- private AlarmManager mManager;
- private PendingIntent mPi;
- public IBinder onBind(Intent intent) {
- return null;
- }
- public void onCreate() {
- Log.e(TAG, "onCreate: ");
- super.onCreate();
- }
- public int onStartCommand(Intent intent, int flags, int startId) {
- String s = SPUtils.get(UIUtils.getContext(), "RefreshToken", "") + "";
- long lo = (long) SPUtils.get(UIUtils.getContext(), "ExpiredToken", UtilsConstant.DSE);//根据实际来 我这是根据自己服务器时间进行的
- mManager = (AlarmManager) getSystemService(ALARM_SERVICE);
- long triggerAtTime = SystemClock.elapsedRealtime() + lo;//每隔多久请求一次 lo是时间 单位毫秒
- Log.e(TAG, "onStartCommand: " + triggerAtTime);
- Intent i = new Intent(this, AlarmssReceiver.class);//开启广播
- mPi = PendingIntent.getBroadcast(this, 0, i, 0);
- mManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, mPi);//启动
- //判断是否第一次进来,一般来说用户登录就直接开启服务 判断是第一次登录就不用请求
- if (!control) {
- control = true;
- Log.e(TAG, "第一次进来");
- } else {
- Log.e(TAG, "第二次进来");
- Log.e(TAG, "onStartCommand: 开始请求网络获取Token" + s);
- Log.e(TAG, "隔多久请求" + lo);
- if (!TextUtils.isEmpty(s)) {
- //这里放请求网络的逻辑 可以先打个log看看
- } else {
- Toast.makeText(getApplicationContext(), "你好请重新登录", Toast.LENGTH_SHORT).show();
- }
- }
- return super.onStartCommand(intent, flags, startId);
- }
- public void onDestroy() {
- Log.e(TAG, "onDestroy: 关闭广播注册者");
- mManager.cancel(mPi);//关闭的服务的时候同时关闭广播注册者
- super.onDestroy();
- }
这里写一个广播,用来定时刷新一下服务
- public class AlarmssReceiver extends BroadcastReceiver {
- public void onReceive(Context context, Intent intent) {
- Intent i = new Intent(context, TokenService.class);
- //启动服务
- context.startService(i);
- }
- }