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