我在一个需要每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;
}
}
答案 0 :(得分:1)
这是我的2美分。
我假设您正在调用refreshToken()
以从服务器获取新令牌,以便在进行下一个REST调用时可以使用此有效令牌。
即使用户可能没有积极使用您的应用程序,也可以代替以下操作:在后台连续运行服务,刷新令牌并消耗资源,您可以执行以下操作:
注意:如果您使用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
函数中刷新令牌。但是,这种情况可能会根据您的服务器端实现而有所不同。
希望有帮助!