一般來說,android的一些耗時的操作很多都會丢給背景服務來做,而一些公司因為安全原因,再每次請求的網絡的時候請求頭會隔一段時間變化一次,但是也不能每次請求網絡都去拿一次請求頭,是以這個時候在service背景定時請求網絡擷取最新的請求頭然後儲存起來是很有必要的,
下面直接貼代碼,記錄一下
public static final String TAG = "TokenService";
private static boolean control = false;
private TokenBean mTokenBean;
private AlarmManager mManager;
private PendingIntent mPi;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate: ");
super.onCreate();
}
@Override
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);
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: 關閉廣播注冊者");
mManager.cancel(mPi);//關閉的服務的時候同時關閉廣播注冊者
super.onDestroy();
}
這裡寫一個廣播,用來定時重新整理一下服務
public class AlarmssReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
UIUtils.startTokenService();//可以把開啟跟關閉服務的邏輯封裝一下,直接調用
// Intent i = new Intent(context, TokenService.class);
// //啟動服務
// context.startService(i);
}
}