天天看點

android 如何在service中定時請求網絡

一般來說,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);
    }
}