【问题标题】:How to refresh token after particular time?如何在特定时间后刷新令牌?
【发布时间】:2018-11-05 06:01:57
【问题描述】:

我正在一个应用程序中工作,我需要在每 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;
    }
}

【问题讨论】:

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


【解决方案1】:

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

Android 8.0 对后台服务设置了一些限制,这些限制在其developer's documentation 中进行了简要描述。如果您确实需要每 60 分钟刷新一次令牌,那么您可以考虑使用他们文档中建议的 JobScheduler。

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

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    这是我的 2 美分。

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

    即使用户可能没有积极使用您的应用,您也可以执行以下操作,而不是在后台持续运行服务、刷新令牌和消耗资源:

    • 在 SharedPreference 中保留一个本地标志,用于记录自上次调用刷新令牌以来的时间。或者您可以保存时间戳,直到当前令牌有效。
    • 在进行 REST 调用之前,您可以通过检查您的共享偏好来检查您当前的令牌是否有效。
    • 如果它无效,请获取一个新令牌,然后当您收到响应时,使用该新令牌进行初始调用。还要保留您收到的令牌并更新 SharedPreference 标志。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2020-07-12
      • 2017-05-29
      • 2017-04-14
      相关资源
      最近更新 更多