0

特定のタスクが特定の時間にバックグラウンドで実行されるアプリケーションを開発しています。

Android 開発者向けドキュメントでは、さまざまな方法が提案されています。この目的で AlarmManager を使用できることはわかっています。しかし、Doze モードで Android 6.0 の AlarmManager を使用すると、不適切なトリガーが発生すると思います。

開発者ドキュメントから JobScheduling ライブラリに出会いました

私のアプリケーションは Android 5.0 未満のバージョンをサポートしているため。FireBaseJobDispatcher を使用することを考えました。

特定の時間に特定のタスクをトリガーするために FirebaseJobDispatcher を使用できますか?

例: 午前 9 時から午後 6 時まで 1 時間に 1 回 DB を更新したい

4

1 に答える 1

1

できますが、タイム ウィンドウがそれほど厳密でない場合は、Doze モードのため、タスクが数時間後に機能し始めるという保証はありません。本当に厳密なスケジューリングが必要な場合は、AlarmManager.setAndAllowWhileIdle を使用してください。そして、私が知っているように、FirebaseJobDispatcher はまだリリースされておらず、未解決の問題がいくつかあります。com.google.android.gms:play-services-gcmリリース前であれば、この目的でGCMNetworkManager (Google Play Services から) を使用できます。FirebaseJobDispatcher のコードは次のようになります。

final FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
if (isSyncEnabled) {

    Job job = dispatcher.newJobBuilder()
            .setService(SyncService.class)
            .setTag(TAG)
            .setConstraints(isSyncOnlyWiFi ? Constraint.ON_UNMETERED_NETWORK : Constraint.ON_ANY_NETWORK)
            .setRecurring(true) // !!!
            .setLifetime(Lifetime.FOREVER) //!!!
            .setTrigger(Trigger.executionWindow(syncIntervalInSeconds, syncIntervalInSeconds + TIME_WINDOW_IN_SECONDS))
            .setReplaceCurrent(true)
            .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
            .build();

    final int result = dispatcher.schedule(job);
    if (result != FirebaseJobDispatcher.SCHEDULE_RESULT_SUCCESS) {
        // pre handle error
    }

GcmNetworkManager の場合:

PeriodicTask task = new PeriodicTask.Builder()
            .setService(SyncManagerService.class)
            .setTag(TASK_TAG_SYNC_SERVICE)
            .setUpdateCurrent(true)
            .setPersisted(true)
            .setPeriod(period)
            .setFlex(flexInSeconds < period ? flexInSeconds : period)
            .setRequiredNetwork(wifiOnly ? PeriodicTask.NETWORK_STATE_UNMETERED : PeriodicTask.NETWORK_STATE_CONNECTED)
            .build();

GcmNetworkManager.getInstance(context).schedule(task);
于 2016-10-07T05:23:03.270 に答える