Android предотвратява възстановяването на намерение след Унищожаване на бутона за връщане назад

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

Сценарий:

MainActivity има метод handleIncomingIntent()

Този метод анализира екстрите, идващи във входящото намерение (за услуга или приемник за излъчване) и отваря дъщерни дейности въз основа на данни за намерение. Така че, когато входящото намерение има данни от тип A, то ще startActivity(ActivityA.class), ако е от тип B, тогава startActivity(ActivityB.class), ако няма данни, ще остане в MainActivity

Проблемът е, когато на устройството липсва памет, MainActivity се унищожава, докато сте в ActivityA или ActivityB.

Следователно, когато се използва BackButton - MainActivity се възстановява и неговото входящо намерение се възстановява в същото състояние, както преди да го обработя, въпреки факта, че правя incomingIntent.removeExtras(KEY) в края на моя метод handleIncomingIntent(). Така че резултатът е - започва отново детската дейност и това е цикъл!

Осъзнавам, че мога да съхраня някакъв флаг isIntentConsumed в паметта вътре в onDestroy() и след това да го прочета restoreSavedState() и да го използвам, за да отхвърля намерението, тъй като то вече е консумирано.

Просто чувствам, че трябва да има по-добър начин от "превръзката", която току-що описах.

С уважение, Павел


person Pavel Kirillov    schedule 19.03.2015    source източник


Отговори (2)


Ако спряната дейност бъде унищожена поради системни ограничения, различни от нормалните условия (потребителят натиска назад или дейността завършва сама), ще бъде извикан методът onSaveInstanceState(Bundle savedInstanceState). Когато потребителят се върне обратно към този вид дейност, ще бъде извикан onRestoreInstanceState(Bundle savedInstanceState) и предишният записан пакет ще бъде предаден като параметър към onRestoreInstanceState() и onCreate().

Така че можете да проверите действителния параметър на onCreate(Bundle savedInstanceState), ако savedInstanceState != null можете да знаете, че дейността е пресъздадена. Надеждата помогна.

person Terry Liu    schedule 20.03.2015
comment
Благодаря, Тери, ще го пробвам тази вечер и ще гласувам за, ако работи. - person Pavel Kirillov; 20.03.2015
comment
Уау, това беше толкова просто. Не съм мислил за това. Благодаря ти Тери. Това е правилен отговор - person Pavel Kirillov; 24.03.2015
comment
@PavelKirillov :) наздраве, забавлявайте се! - person Terry Liu; 24.03.2015

какво имаш предвид

Проблемът е, когато на устройството липсва памет, MainActivity се унищожава, докато сте в ActivityA или ActivityB. не е ясно и също

Следователно, когато се използва бутон Назад

Мисля, че говорите за събитието с натискане на бутона за връщане назад в дейност А или Б, ако случаят е такъв, бих ви предложил да завършите основната дейност, след като преминете към дейност А или Б. след това при A/B дейност, трябва да преминете през метода onBackPressed(), трябва да започнете основната дейност отново и да завършите дейност A/B.

правенето на това ще спаси устройството от недостиг на памет. Между другото пробвахте ли го и на истинско устройство? ако не, проверете го на реално устройство и ни уведомете. Надявам се, че ще работи за вас

person ghost talker    schedule 20.03.2015
comment
Благодаря за отговора, призрак, да. На истинско устройство има опция за разработчици, наречена унищожаване на неактивни дейности. Когато е избрано, веднага щом дейност A/B покрива изцяло основната ми дейност, операционната система унищожава последната. Но както се досещате правилно, когато щракна върху бутона за връщане назад на A/B, Main се пресъздава. Въпреки това намерението, което отвори Main, се възстановява до първоначално състояние, сякаш е за първи път. - person Pavel Kirillov; 20.03.2015
comment
Не мисля, че е по-добър модел да завършите Main и да го създадете отново от A/B, защото A/B може да бъде отворен от други викащи, като C или D... Така че в крайна сметка ще предам повикващия на дете и ще управлявам всички видове сценарии в бутона за връщане, вместо да завършите A/B и да стигнете до мястото, откъдето идва. Може би има добър начин да попречите на Android да пресъздаде намерението до неговото непроменено състояние. Работата ми работи, просто не ми се струва правилно. Добавих millis отпечатък за генериране на време и го запазвам в споделени предпочитания, за да видя по-късно дали съм го използвал или не и игнорирам, ако е необходимо. - person Pavel Kirillov; 20.03.2015
comment
Мисля, че това е нещо като диамантен проблем :), но се надявам, че скоро ще подобрите кодирането си и ще се удовлетворите - person ghost talker; 20.03.2015