Android:在不依赖操作系统时间的情况下计算给定时间内的天数

时间:2017-08-17 07:49:04

标签: android time service timer

在我的应用中,如果用户没有刷新30天,我需要更新一个对象。我尝试了几个方法来解决这个问题,但没有一个工作

1。使用System.currentTimeMillies()

我的第一次尝试是只存储对象更新的时间并将其与当前时间进行比较。一切都运行正常,但问题是,用户可以改变操作时间,然后时间检查将无用......

2。使用AlarmManager

这里我遇到了与上面相同的问题

第3。实施包含计时器的服务

在这里,我实施了一个Service,其计时器最长可达30天。这似乎是最好的解决方案,但是当我关闭应用程序时服务停止。 我的服务的onCreateonStartCommand看起来像这样(我只是将30天改为2分钟进行测试,它包含多个对象的多个计时器):

@Override
public void onCreate() {
    Log.i(TAG, "[onCreate]");
    super.onCreate();
    registerReceiver(new StopServiceReceiver(), new IntentFilter(STOP_SERVICE_REQUEST));
    context = this;

    //retrieveTimers();
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent == null) {
        Log.i(TAG, "[onStartCommand] intent = null");
        return super.onStartCommand(intent, flags, startId);
    }

    //prevent starting 2 timers for the same id
    String id = intent.getStringExtra(KEY_CARD_ID);
    if (timerHashMap.containsKey(id)) {
        Log.i(TAG, "[onStartCommand] timer already exists");
        return super.onStartCommand(intent, flags, startId);
    }

    //create and start timer
    Log.i(TAG, "[onStartCommand] schedule timer");
    Timer timer = new Timer();
    timer.schedule(new CounterTask(id), MAX_MILLIES_WITHOUT_UPDATE);
    timerHashMap.put(id, timer);
    // storeTimers();

    return super.onStartCommand(intent, flags, startId);
}

我还尝试将定时器映射存储在共享首选项中,但后来我意识到thsi有点愚蠢,因为定时器应该继续并序列化定时器来存储它也是不可能的(并且正如我所说的那种愚蠢; - ))

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用JobScheduler(或其某些变体)。

Minimum LatencyPeriodic选项可以安排作业在30天后运行。

有关详细信息,请参阅此文章:Scheduling jobs like a pro with JobScheduler

最新支持库中有JobIntentServiceFirebase JobDispatcher为向后兼容性。