Статични променливи на жизнения цикъл на BroadcastReceiver

Имам клас BroadcastReceiver. Имам някои декларирани статични променливи, чиято стойност се актуализира встрани от метода onReceive(). Според моите познания статичната променлива ще запази стойността си в извикванията onReceive. Има ли някаква възможност, когато ще загубя тези стойности (като моят клас ще бъде разтоварен при нулиране на статичните променливи)? Това са основно някои временни променливи, които трябва да бъдат налични за множество onReceive повиквания.


person Sush    schedule 09.06.2011    source източник


Отговори (2)


От документацията за жизнен цикъл на BroadcastReceiver...

Обектът BroadcastReceiver е валиден само за продължителността на извикването на onReceive(Context, Intent). След като вашият код се върне от тази функция, системата счита обекта за завършен и вече неактивен.

Това няма да направи използването на статични променливи практично в смисъл, че нещата ще бъдат изчистени бързо от системата. Бих опитал да използвам SharedPreferences, като се обадя...

context.getSharedPreferences("MyReceiver", MODE_PRIVATE)

...в метода onReceive(...) на приемника (заменете "MyReceiver" с някакво име, което има смисъл за вашето приложение).

person Squonk    schedule 09.06.2011
comment
Но статичните променливи са променливи на ниво клас и не трябва да се почистват, когато обектът се унищожи. Моля, поправете ме, ако греша. Наясно съм с getSharedPreferences(), но просто исках да използвам статични променливи, тъй като след известно време трябва да изчистя тези променливи, след като свърша работата си с тях, и не искам те все още да присъстват в SharedPreferences. Накрая, ако може да бъде постигнато чрез променливи, тогава не искам да използвам SharedPreferences. Ако не може да бъде, тогава определено ще отида за SharedPreferences. - person Sush; 10.06.2011
comment
@Sush: Но статичните променливи са променливи на ниво клас и не трябва да се почистват, когато обектът се унищожи. - И така, "къде" променливите на класа "съществуват", когато последното копие на този клас е унищожено? Те не просто се реят в киберпространството и чакат да се появи друг екземпляр от този клас. Както е обяснено в цитата от документите, когато onReceive(...) излезе, системата счита обекта за завършен. По принцип не можете да гарантирате дали/кога обектът BroadcastRecever ще бъде GC'd. Що се отнася до SharedPreferences, можете просто да ги „изчистите“, когато вече не са необходими. - person Squonk; 10.06.2011
comment
@MisterSquonk: Съгласен съм, че SharedPreferences може да свърши работа. Но категорично не съм съгласен, че статичните променливи ще бъдат унищожени, след като последното копие на класа бъде унищожено. Статичните променливи се инициализират, когато класът се зареди в паметта, т.е. когато приложението стартира и остава в паметта, докато класът е в паметта. Не зависи от Обектите, за да живееш. - person Sush; 10.06.2011
comment
@Sush: ОК, съгласих се WRT статичните променливи да не се унищожават, след като последният екземпляр на класа бъде унищожен, формулирах го лошо. Ще преформулирам нещата - след като BroadcastReceiver излезе от onReceive() и евентуално бъде GC'd, ако това е последният активен компонент на приложението като цяло, има повишена опасност самото приложение да бъде целта за Android ОС да се прекрати, ако ресурсите на устройството са ниски. Ако това се случи, тогава ще загубите текущите стойности, тъй като следващия път, когато приемникът бъде „задействан“, приложението ще бъде създадено отново/инициализирано отново. SharedPreferences обаче продължават. - person Squonk; 11.06.2011
comment
@MisterSquonk: Благодаря за търпението, за да ме накарате да разбера. Разбрах идеята. Благодаря отново.. - person Sush; 12.06.2011
comment
@Squonk Както знам, този цитат е верен само за статично декларирани в Manifest BroadcastReceiver. Регистрираните в контекста получатели няма да бъдат извиквани, след като дейността по притежаване бъде унищожена. - person B-GangsteR; 16.04.2017

Или, разбира се, можете да декларирате статичните променливи в рамките на вашия клас на дейност.

person Will Kru    schedule 09.06.2011
comment
Да, мога. Но има ли проблем с декларирането на статичните променливи вътре в BroadcastReceiver? - person Sush; 10.06.2011
comment
Няма значение статичната променлива да бъде декларирана в Activity, BroadcastReceiver или клас. Статичната променлива се държи по същия начин. - person jclova; 04.12.2014