Acum cazul complex: Patru activități și una dintre ele ucisă
Iată situația cu care m-am confruntat: Aplicația are un flux conform căruia unele activități ar fi terminate și altele ar fi păstrate pe măsură ce utilizatorul completează formularele.
Fluxul problematic:
A started B
B started C; B finishes itself
C started D
D sends result to A
Așa că stiva finală ar fi
A -> B(killed) -> C -> D
Cum să trimitem rezultatul de la D înapoi la A?
Dacă nici o activitate nu a fost ucisă, era vorba doar de a înlănțui setResult() și onActivityResult(). Cu toate acestea, lucrurile nu sunt atât de simple atunci când se ucide o activitate în mijlocul procesului.
Deci:
Activitatea A
goToNextActivity(){
startActivityForResult(intentActivityB, SOME_REQUEST_CODE);
}onActivityForResult(...){
doSomeStuffWithResult();
}
Activitatea B
goToNextActivity(){
intentActivityC = new Intent(...);
startActivity(intentActivityC);
}
Dacă facem doar acest lucru, va exista o problemă: Deoarece activitatea B nu mai există, rezultatul pe care l-am setat pe activitatea C va fi pierdut. Așadar, ceea ce trebuie făcut este să adăugăm acest indicator (FLAG_ACTIVITY_FORWARD_RESULT), pentru a spune intenției că această activitate va fi terminată și eliminată din stivă, prin urmare părintele ar trebui să se ocupe de rezultat.
NOTA 1: dacă activitatea părinte va fi și ea terminată, puteți folosi din nou acest indicator pentru ca următoarea activitate din stivă să se ocupe de rezultat. Din acest motiv, trebuie să porniți activitatea cu startActivity în loc de startActivityForResult (deoarece aceasta nu va gestiona niciun rezultat, așa cum determină stegulețul)
goToNextActivity(){
intentActivityC = new Intent(...);
intentActivityC.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intentActivityC);
}
Activity C
goToNextActivity(){
intentActivityD = new Intent(…);
intentActivityD;
startActivityForResult(intentActivityD, SOME_REQUEST_CODE);
}onActivityResult(int reqCode, int resultCode){
if(reqCode == SOME_REQUEST_CODE){
setResult(resultCode);
finish();
}
}
Activity D
goBackToActivityA(){
setResult(someResultCode);
finish();
}
Aceasta va trimite someResultCode către C, care îl va gestiona cu onActivityResult și îl va trimite din nou înapoi cu setResult(…) finish();
care va ști apoi, datorită indicatorului, că activitatea B nu mai există, prin urmare activitatea care ar trebui să se ocupe de aceasta este activitatea A, ceea ce înseamnă că în cele din urmă codul rezultat va ajunge în onActivityResultCode al activității A.