2011-11-16 16 views
6

Ta aplikacja została już wdrożona. Dowiedziałem się o ACRA i dodam to, aby dowiedzieć się, dlaczego dochodzi do awarii aplikacji.Aplikacja systemu Android ulega awarii, ale nie uruchamia się ponownie - wznawia się z innego punktu aplikacji

Mój problem polega jednak na tym, że aplikacja ulegnie awarii (pojawi się okno dialogowe z opcją "Wymuś zamknięcie" lub "Czekaj"), ale zamiast ponownego uruchomienia aplikacji, wznawia pracę od punktu sprzed nastąpiła awaria. Powoduje to jednak problemy, które są naprawiane tylko przez ponowne uruchomienie aplikacji (np. Nagła utrata danych, awarie, które nie mają sensu itp.).

Jak mogę zmusić moją aplikację po awarii, aby po prostu się skończyła? (NIE restartuj).

Edycja: Największym problemem jest to, że po awarii aplikacji wszystkie dane w moim pliku preferencji znikają, aż do ponownego uruchomienia aplikacji po jej powrocie.

+0

Wierzę, że stoisz tutaj przed "ANR" lub działalnością nie Odpowiadanie, które różni się od awarii aplikacji (Wymuś zamknięcie). Wydaje się, że niektóre operacje w aplikacji blokują główny wątek (wątek interfejsu użytkownika) przez określony czas, co powoduje wyświetlenie okna dialogowego zamykania/oczekiwania na siłę. Jeśli wybierzesz opcję oczekiwania, aplikacja nie będzie reagować na zakończenie tej operacji. Następnie aplikacja zostanie wznowiona. Ale gdy naciśniesz "Wymuś zamknięcie", aplikacja zostanie zamknięta i uruchomiona ponownie, gdy uzyskasz do niej dostęp następnym razem. – Abhijit

+0

To nie jest przypadek ANR, czasami pokazuje "Wymuszaj zamknięcie" lub "Czekaj", które jest Wątek interfejsu użytkownika jest blokowany, ale czasami jest to po prostu "Wymuś zamknięcie", więc aplikacja rzeczywiście się zawiesiła. Aplikacja nie wyłącza się konsekwentnie - na niektórych platformach wyłącza się, ale na innych po prostu wznawia od poprzedniego punktu i utraciła wszystkie dane wstępne. – digerati32

Odpowiedz

3

System Android domyślnie uruchomi ostatnią aktywną czynność. Zamiast zmuszać go do ponownego uruchomienia, lepszą strategią będzie poprawienie aplikacji, aby działania nie ulegały awariom ani nie kończyły się pomyślnie, nawet jeśli żadne dane nie są dostępne. Jeśli całkowicie polegasz na pewnych danych (dodatkach intencyjnych) i nie ma wartości domyślnych, możesz po prostu zadzwonić pod numer finish(), jeśli nie jest on dostępny, lub rozpocząć działanie główne/nadrzędne.

Innym sposobem jest posiadanie własnego domyślnego programu obsługi wyjątku, który ponownie uruchamia główną aktywność, itp. Po zgłoszeniu awarii przy użyciu ACRA (wydaje mi się, że jest to żądanie funkcji w urządzeniu śledzącym ACRA).

+0

Chciałbym poprawić moją aplikację, ale niestety już została ona wdrożona i dodałem ACRA, aby wychwycić wyjątki teraz, ale na wszelki wypadek chciałbym mocno zamknąć aplikację. Sprawdziłem ACRA i nie mogłem znaleźć tej funkcji ...Zakładam, że jeszcze nie został wdrożony? – digerati32

+1

Tylko dlatego, że wdrożone działanie nie oznacza, że ​​nie możesz go naprawić i ponownie wdrożyć, ludzie chętnie zaktualizują swoje aplikacje, aby naprawić awarie. –

+0

W zależności od wersji systemu operacyjnego (lub sposobu, w jaki została zaimplementowana przez telefon), aplikacja zostanie zamknięta, jeśli aplikacja ulegnie awarii. Nie byłem w stanie znaleźć sposobu na zamknięcie aplikacji, nawet gdy ACRA ją zawiesza. Najbardziej można zrobić "cichy" crash z ACRA obecnie, tak że nie pojawi się okno dialogowe. Dodałem aktualizację z zainstalowaną ACRA, więc mam nadzieję, że będę w stanie ustalić przyczyny awarii, a następnie mogę je naprawić. Po prostu zaznaczę twoje pytanie jako poprawne, ponieważ jest ono najbliżej bycia poprawnym ... nie ma jednak odpowiedzi. – digerati32

1

Wiem, że to pytanie jest nieco stary, ale dla przyszłych odniesień i Googlersami, tutaj jest pełna odpowiedź od drugiego, trudno znaleźć, stackoverflow pytanie: Android App Restarts upon Crash/force close


utworzyć klasy używane do obsługi unCaughtException

public class MyExceptionHandler implements 
     java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 
    private final Class<?> myActivityClass; 

    public MyExceptionHandler(Context context, Class<?> c) { 

     myContext = context; 
     myActivityClass = c; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 

     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     System.err.println(stackTrace);// You can use LogCat too 
     Intent intent = new Intent(myContext, myActivityClass); 
     String s = stackTrace.toString(); 
     //you can use this String to know what caused the exception and in which Activity 
     intent.putExtra("uncaughtException", 
       "Exception is: " + stackTrace.toString()); 
     intent.putExtra("stacktrace", s); 
     myContext.startActivity(intent); 
     //for restarting the Activity 
     Process.killProcess(Process.myPid()); 
     System.exit(0); 
    } 
} 

Następnie w każdym wątku (zazwyczaj masz tylko jeden, jeśli nie rozpocząć nowy wątek (asynchroniczny lub ..., oczywiście wiesz o wątków, jeśli jesteś w stanie zrobić nowy;)), ustawić ta klasa jako DefaultUncaughtExceptionHandler

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, 
      YourCurrentActivity.class)); 

Pamiętaj jednak! Zrób to na samym końcu tworzenia aplikacji, musisz przynajmniej spróbować obsłużyć wszystkie swoje wyjątki jeden po drugim, zanim pozostawisz je na DefaultUncaughtExceptionHandler

+0

potrzebujemy zarówno ACRA, jak i zrestartować całą aplikację –