我想在我的应用中开始刷新Service
。我要实现的是每5分钟进行一次API调用,即使用户锁定了屏幕以更新数据,尤其是通过使用API调用中的新数据重新创建Notification来更新可见的Notification。
我试图将逻辑移到Application类,在其中我将在Job
中初始化GlobalScope
,该类将无限期运行,直到我取消此Job
。如果将延迟设置为10或30秒,则此解决方案有效。即使我的应用程序在后台,它也可以正常工作。但是,如果我将延迟设置为更长的时间(在这种情况下需要)(例如5-10分钟),它将突然停止。我的理解是,长时间不活动时,此Job将会消失或Application类被破坏。
我想创建将与我的Application类进行通信的Service,并在Service中初始化此Job以调用Application类函数以刷新Notification。但是我不能在Service中使用参数。
有什么方法可以链接应用程序类和服务?
如果App被杀死,我不需要运行此refreshAPI。
示例(此应用程序在Application类中运行-要将其移至Service并从Service类调用app.callRefreshAPI()):
var refresher: Job? = null
private var refreshRate = 300000L
fun createNotificationRefresher(){
refresher = GlobalScope.launch {
while (isActive){
callRefreshAPI()
delay(refreshRate)
}
}
}
更新:CountDownTimer解决方案(不起作用):
var refresher: CountDownTimer? = null
private var refreshRate = 300000L //5min
private var refresherDuration = 780000L //12min
fun initNotificationRefresher(){
refresher = object : CountDownTimer(refresherDuration, refreshRate) {
override fun onTick(millisUntilFinished: Long) {
callRefreshAPI()
}
override fun onFinish() {
initNotificationRefresher()
}
}.start()
}
更新2::手机屏幕锁定且操作系统处于睡眠模式时,计时器/工作/工作人员无法使用。这意味着无法在后台操作中使用计时器。我必须使用在Application类中注册的BroadcastReceiver(不!AndroidManifest)并收听SCREEN_ON动作。然后节省用户解锁手机时的时间,并检查在更新屏幕通知和在这种情况下通过在GlobalScope中调用API刷新通知之间至少相隔5-10分钟。
我希望这对其他人有帮助。如果应用程序在后台并且用户仍在与手机交互(检查其他应用程序,浏览内容等),则Job / Timer将起作用。
答案 0 :(得分:1)
您可以使用CountDownTimer。并创建一个IntentService类,并运行该服务以进行API调用。
JAVA
public void repeatCall(){
new CountDownTimer(50000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
repeatCall();//again call your method
}
}.start();
}
//Declare timer
CountDownTimer cTimer = null;
//start timer function
void startTimer() {
cTimer = new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
}
};
cTimer.start();
}
//cancel timer
void cancelTimer() {
if(cTimer!=null)
cTimer.cancel();
}
科特琳
fun repeatCall() {
object : CountDownTimer(50000, 1000) {
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
repeatCall()//again call your method
}
}.start()
}
答案 1 :(得分:0)
尽管每5分钟调用一次API并不是完成任务的最优化方法。 定期作业的最小值为15分钟。 您可以使用
private void schedulePeriodicJob() {
int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
.setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(5))
.build()
.schedule();
}