Изясняване на поведението на AlarmManager в Android

Виждам всички примери за задаване на AlarmManager от дейност.

Въпросът ми е следният: Ако приложението ми задава повтарящ се AlarmManager, това продължава ли дори след като стартираното приложение е затворено и премахнато от паметта?

Ако не, как да стартирам AlarmManager на по-ниско ниво, което се стартира от Android при зареждане и ако някога се провали или умре, или хвърли изключение, се рестартира, без потребителят да трябва да прави нещо?

И накрая, ако действието, което искам BroadcastReceiver да предприеме, няма визуални компоненти, все пак трябва ли да създам отделна дейност за него? В моя случай искам да има програма за качване във фонов режим, която се събужда и разглежда папка и ако види файлове в тази папка, ги изпраща на сървъра. Нямам нужда от обратна връзка с потребителя.

Така че моят идеал би бил да имам магически AlarmManager, базиран на операционна система, който извиква IntentService, който само обработва качването, но не ми е ясно как да накарам такъв AlarmManager да работи на първо място.

TIA


person Yevgeny Simkin    schedule 21.02.2011    source източник
comment
какво се случва, ако приложението бъде преместено във външно хранилище и алармата е зададена и след това паметта е премахната, как ще се държи алармата в този случай и как да се справим с тази ситуация.   -  person user606669    schedule 28.06.2013


Отговори (2)


Да, AFAIK, алармите "оцеляват" и продължават да се задействат, дори след като активността, която ги е регистрирала, приключи. Но те не оцеляват при рестартиране на телефона.

Ако разбирам проблема ви правилно, мисля, че можете да постигнете това, което търсите, като създадете проект с приемник за излъчване, който слуша за android.intent.action.BOOT_COMPLETED намерения и след това (пре)регистрирайте повтаряща се аларма, която на свой ред започва (Намерение) услуга за извършване на качването.

Не се нуждаете от дейност, но вероятно ще искате такава, за да позволите на потребителя временно да деактивира механизма за качване, като постави отметка в квадратче или нещо подобно. Вероятно също би било хубаво да позволите на потребителя да избере честотата на вашата аларма, т.е. колко често услугата трябва да се стартира и да търси нови файлове за качване. Това също би било добро място да регистрирате алармата си за първи път.

person Nicolai Buch-Andersen    schedule 21.02.2011
comment
Намерих всички отговори на всички тези въпроси в друга SO тема... stackoverflow.com/questions/3859489/. Ти обаче си на място. - person Yevgeny Simkin; 22.02.2011
comment
Странична бележка: на Android 2.1 и по-ранни версии убийците на задачи ще изтрият алармите ви. - person CommonsWare; 22.02.2011
comment
@Dr.Dredel: Що се отнася до въпроса ви по-долу относно конкурентните аларми, това не би трябвало да е проблем. От javadoc за мениджъра на аларми: Ако вече има планирана аларма за това намерение (с равенство на две намерения, дефинирано от filterEquals(Intent)), тогава тя ще бъде премахната и заменена от тази. Така че, ако използвате едно и също чакащо намерение както в приложението, така и при зареждане, това ще гарантира, че само една аларма е активна в даден момент. - person Nicolai Buch-Andersen; 23.02.2011
comment
@CommonsWare Какво се случва, ако приложението бъде преместено във външна памет и алармата е зададена и след това паметта е премахната, как ще се държи алармата в този случай и как да се справим с тази ситуация - person user606669; 28.06.2013
comment
@user606669: Не инсталирайте приложения във външна памет, които изискват аларми: developer.android.com/guide/topics/data/ - person CommonsWare; 28.06.2013

Съгласен съм с Николай, че ще имате 2 излъчващи приемника във вашето приложение:

  • такъв, който пререгистрира алармата при зареждане
  • такъв, който стартира вашата услуга, когато се задейства от алармата

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

може би също така помислете за setInexactRepeating (вместо setRepeating) за вашата аларма, както и за използване на работна нишка за обработка на дългите качвания (в случай че потребителят иска да използва вашата дейност в основната нишка едновременно).

person darma    schedule 22.02.2011
comment
като страничен въпрос, как да избегна две зададени аларми (една от приложението и една от зареждане?). Не искам да се състезават помежду си. Има ли начин да се види дали един вече работи, преди да се запали друг? - person Yevgeny Simkin; 22.02.2011