在特定时间后如何刷新令牌?

时间:2018-11-05 06:01:58

标签: java android android-service android-8.0-oreo

我在一个需要每60分钟刷新一次令牌的应用程序中工作。我创建了在后台运行的服务。但是,我面临的问题是,当手机进入睡眠模式时,我的服务停止了,因此我无法刷新令牌。我主要在OREO和PIE中遇到此问题。

public class InActivityTimer extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
        mService = APIUtils_AI.getSOService();
        mService2 = APIUtils_AI.getSOServiceAI();
        utils = new Utils();
        receiver = new BroadcastTokenCheck();
        filter = new IntentFilter(COUNTDOWN_BR);
        registerReceiver(receiver, filter);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        cdt = new CountDownTimer(15000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                Log.i(TAG, "Countdown seconds remaining: " + millisUntilFinished / 1000);
                if(millisUntilFinished<8000&&millisUntilFinished>5000){
                    if(!isSecond){
                        Log.i("", "Running: ");
                        refreshToken();//Refresh Token API
                        cdt.cancel();
                        cdt.start();
                    }
                }
            }

            @Override
            public void onFinish() {
                Intent intent = new Intent(COUNTDOWN_BR);
                intent.putExtra("VALUE","startService");
                sendBroadcast(intent);
                //stopSelf();
                Log.i("", "Timer finished");
            }
        }.start();

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(receiver);
        Log.e("Service Status: ","Stopped");
        cdt.cancel();
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

2 个答案:

答案 0 :(得分:1)

这是我的2美分。

我假设您正在调用refreshToken()以从服务器获取新令牌,以便在进行下一个REST调用时可以使用此有效令牌。

即使用户可能没有积极使用您的应用程序,也可以代替以下操作:在后台连续运行服务,刷新令牌并消耗资源,您可以执行以下操作:

  • 在SharedPreference中保留一个本地标志,您可以在其中记录自从上次调用刷新令牌以来经过了多长时间。或者,您可以保存时间戳,直到当前令牌有效为止。
  • 在进行REST调用之前,您可以通过检查共享首选项来检查当前令牌是否有效。
  • 如果无效,请获取一个新令牌,然后在收到响应时,使用该新令牌进行初始呼叫。还要持久保存您收到的令牌,并更新SharedPreference标志。

注意:如果您使用Retrofit for REST调用,则可以使用Interceptor之类的东西来进行上述检查。像这样的答案:Answer on "Refreshing OAuth token using Retrofit without modifying all calls"

答案 1 :(得分:1)

我的建议是在必要时刷新令牌。据我了解,令牌是验证服务器应用程序中的API调用所必需的。当API返回未授权或401错误状态时,在这种情况下,您可以考虑刷新令牌。

Android 8.0对后台服务施加了一些限制,这些限制在其developer's documentation中进行了简要说明。如果确实需要每60分钟刷新一次令牌,则可以考虑使用其文档中建议的JobScheduler。

但是,如果上次刷新后60分钟过去了,我建议您在启动器活动的onResume函数中刷新令牌。但是,这种情况可能会根据您的服务器端实现而有所不同。

希望有帮助!