Android - Изпълнение на фонова задача на всеки 15 минути, дори когато приложението не работи

Трябва да създам фонова задача, която да се изпълнява на всеки 10/15 минути (няма особено значение, и двете са добри), дори когато приложението не работи.

Как мога да постигна това? Не мога да си обясня това.

Четох, че мога да използвам някаква функция runnable() или да използвам фонови услуги или AlarmManager. Мислех за фонова услуга, тъй като тя също трябва да се направи, когато самото приложение не работи.

Какъв е по-добрият начин да направя това и как мога да го направя?


person DijkeMark    schedule 22.04.2013    source източник


Отговори (5)


Вие сте определили времето (интервал) за изпълнение на фрагмент от код, по-добре е да използвате AlarmManager, защото е по-енергийно ефективен. Ако приложението ви трябва да слуша някакво събитие, тогава услугата е това, от което се нуждаете.

public static void registerAlarm(Context context) {
    Intent i = new Intent(context, YOURBROADCASTRECIEVER.class);

    PendingIntent sender = PendingIntent.getBroadcast(context,REQUEST_CODE, i, 0);

    // We want the alarm to go off 3 seconds from now.
    long firstTime = SystemClock.elapsedRealtime();
    firstTime += 3 * 1000;//start 3 seconds after first register.

    // Schedule the alarm!
    AlarmManager am = (AlarmManager) context
            .getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
            600000, sender);//10min interval

}
person wtsang02    schedule 22.04.2013
comment
Но това позволява ли ми да изпълнявам код дори когато самото приложение не работи? - person DijkeMark; 22.04.2013
comment
да Alarm Manager е като вие (приложението) казвате на операционната система, че искате да направите нещо след X милисекунди по-късно. След това системата изпълнява този код в BroadcastReciever.onRecieve(), това е кодът, който искате да изпълните във фонов режим след x милисекунди. - person wtsang02; 22.04.2013
comment
Работи, наистина е хубаво, но какво ще кажете за спиране на услугата? am.cancel()? или.. благодаря @wtsang02 - person ElTête; 19.05.2015
comment
Какво ще стане, ако трябва да изпълнявам фоновата задача на всеки 100 милисекунди? - person Machado; 07.08.2015
comment
заменете '600000' на 100, това е интервалът в милисекунди. - person wtsang02; 08.08.2015
comment
Тествам в redminote3 (android 5.1.1), alarmmanager не работи след смъртта на активността - person Bikesh M; 02.09.2016

Мениджър на аларми (системна услуга) срещу отдалечена услуга с внедряване на вътрешна аларма (отделен процес)?

Мениджърът на аларми е вашият избор, защото вече има това, от което се нуждаете, просто трябва да зададете интервали на алармата

person pvllnspk    schedule 22.04.2013

Можете също да постигнете това чрез SyncAdapter Ето пример, който да разгледате и да се вдъхновите

syncadapter проба

person Benoit    schedule 22.04.2013

Мениджърът на работа всъщност е най-доброто нещо, което можете да направите с периодично повтаряне, по подразбиране е 15 минути, което точно ви трябва. Ето един пример:

        final PeriodicWorkRequest periodicWorkRequest
                = new PeriodicWorkRequest.Builder(ApiWorker.class, 15, TimeUnit.MINUTES)
                .build();
        WorkManager.getInstance().enqueue(periodicWorkRequest);

Където ApiWorker е само следният клас:

public class ApiWorker extends Worker implements iOnApiRequestSuccessful {

public ApiWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
}

@NonNull
@Override
public Result doWork() {
    return Result.success();
}
}

И попълнете каквато и да е работа, която искате да бъде свършена във функцията doWork() преди връщането с успех.

Return.success() го вмъква отново в опашката, така че ще се повтаря на всеки 15 минути.

person Idan Damri    schedule 14.05.2020

Най-добрият подход беше представен на Google I/O 2018 - WorkManager.

Можете да намерите документация тук.

person mtwain    schedule 06.06.2018