一般来说,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);
-
}
-
}