2010-11-15 15 views

Odpowiedz

57

Po uruchomieniu funkcji startActivity(), wszystko co robi, to opublikowanie zamiaru w kolejce zdarzeń. Faktyczne rozpoczęcie działania dzieje się asynchronicznie w najbliższej przyszłości. Więc nie widzę dużej różnicy między tymi dwoma.

+1

to brzmi rozsądnie również dla mnie – Tima

+3

Animacja jest inna dla mnie. Zobacz moją odpowiedź poniżej. – Monstieur

+0

ale podejście jest po prostu całkowicie NIEPRAWIDŁOWE .. Istnieją flagi (dla intencji, jak również w manifeście), które faktycznie istnieją w tych przypadkach użycia. – Ewoks

6

Zrobiłbym drugi wybór, nie popieram tego, czegokolwiek szukałem z oficjalnych źródeł, ale bardziej sensowne jest rozpoczęcie nowej aktywności, zanim zadzwonisz do mety, w ten sposób nowa aktywność wyskoczy za pomocą intencji, a obecna aktywność w tle może wywołać wszystkie metody oczyszczania.

Jeśli zrobiłeś to na odwrót, może intencja nie będzie miała czasu na ogień przed zakończeniem sprzątania. To znaczy. czy aktywność wywoła funkcję startActivity() po wywołaniu finish()?

Mam nadzieję, że rozumiesz, co próbuję stwierdzić, że zrobię drugą opcję, aby być bezpiecznym.

+0

Tak, zrozumiałem twój pomysł. Brzmi logicznie. Ale nie mogę sobie wyobrazić, kiedy ta sytuacja mogłaby być możliwa – Tima

6

Poza odpowiedzią Emmanuels:

Obie metody startActivity i finish zostaną ustalone po krańcach sposobu wywołującego, ponieważ oba są przetwarzane przez nić UI.

1

miałem podobny problem:

Activity A: singleInstance 
Activity B: singleInstance 
Activity C: singleInstance 

A starts B 
B starts C 
C wants to start A: 

tutaj, jeśli mogę użyć:

finish(); 
startActivity(A); 

coś przewodowy dzieje: Działalność B przychodzi do nowej Zamiast! ale jeśli mogę zmienić kod tak:

startActivity(A); 
finish(); 

wszystko wydaje się OK i aktywność na przychodzi widoczne.

nie wiem w czym problem, ale wydaje się, że w pierwszym przypadku, C jest zakończona przed wykonaniem polecenia startActivity tak, że stos powrotem obsługuje sytuację i pokazuje swoją aktywność, która jest górną B! , ale w drugim przypadku wszystko dzieje się normalnie.

+0

Kiedy skończysz() aplikację, android wyciąga aktywność LRU ze stosu, co oznacza także B. Co sprawia, że ​​myślę, że metoda finish() jest natychmiastowa, a nie asynchroniczna. –

18

Animacja jest wyraźnie inna (przynajmniej od 4.1). Wywołanie finish() najpierw zaczyna zanikać pierwsze działanie wcześniej i na krótko widać czarne tło, zanim nowa aktywność zanika. Wywołanie startActivity() powoduje pierwszy zanik nowej aktywności na starej, a czarne tło nie jest widoczne.

0

Zwykle robię startActivity() przed finish(), ponieważ myślę, że upewniłbym się, że nowy ekran wyjdzie przed poprzednim wyjściem.

Mam stronę logowania w mojej aplikacji. Po pomyślnym zalogowaniu użytkownika logowanie nie działa, a główne działanie jest aktywne.Działa dobrze na Androidzie 4.

Dzisiaj chciałem przepisać go w Material design. Jednak mam duży problem. Nowe studio Android tworzy pustą aktywność z materialnym projektem, który, jak sądzę, zabiera wiele zasobów. Ten sam proces, ale mam błąd

11-26 18:20:44.450 18397-18397/? I/Choreographer: Skipped 42 frames! The application may be doing too much work on its main thread. 
11-26 18:20:44.485 18397-18408/? I/art: Background partial concurrent mark sweep GC freed 2864(191KB) AllocSpace objects, 4(43MB) LOS objects, 13% free, 100MB/116MB, paused 8.056ms total 39.767ms 

Mówi moje aplikacje zajmuje wiele zasobów, gdy mainActivity rozpoczyna się w moim LogCat telefonu. Nie mam nic w mainActivity tylko dlatego, że jest to domyślny układ Material Design.

Odwróciłem zamówienie i teraz działa bezbłędnie na moim telefonie.

Powiązane problemy