2011-11-16 3 views
6

다른 지점에서 다시 시작합니다. 나는 약 ACRA에 대해 알았고, 왜 응용 프로그램 충돌이 일어나고 있는지 알아보기 위해 그것을 추가 할 것입니다.안드로이드 응용 프로그램이 충돌,하지만 다시 시작하지 않습니다 - 문제의 응용 프로그램이 이미 배포 된 응용 프로그램

그러나 내 문제는 응용 프로그램이 중단된다는 것입니다 (대화 상자에 "강제 닫기"또는 "대기"옵션이 표시됨). 응용 프로그램을 완전히 다시 시작하는 대신 이전 시점에서 다시 시작합니다 충돌이 발생했습니다. 그러나이 문제는 응용 프로그램을 다시 시작해야만 해결됩니다 (예 : 갑작스러운 데이터 손실, 이해가 안되는 충돌 등).

그래서 내 응용 프로그램을 강제 할 수있는 방법, 한 번에 단지 끝, 추락? (다시 시작하지 마십시오).

편집 : 가장 큰 문제는 돌아 오면 응용 프로그램을 다시 시작할 때까지 응용 프로그램이 충돌 후, 내 환경 설정 파일의 모든 데이터가 사라진다는 것이다.

+0

'ANR'또는 Activity Not 응답, 앱 충돌과 다릅니다 (강제 종료). 앱의 일부 작업이 특정 시간 동안 주 스레드 (UI 스레드)를 차단하고있는 것 같습니다.이 강제 종료/대기 대화 상자가 표시됩니다. 대기를 선택하면 해당 작업이 완료 될 때까지 앱이 응답하지 않습니다. 그런 다음 앱이 다시 시작됩니다. 그러나 일단 강제 종료를 누르면 다음에 액세스 할 때 응용 프로그램이 종료되고 다시 시작됩니다. – Abhijit

+0

ANR의 경우가 아니며 때때로 "강제 종료"또는 "대기"가 표시됩니다. UI 스레드가 차단되고 있지만 때로는 응용 프로그램이 실제로 충돌하여 "강제 닫기"입니다. 그리고 응용 프로그램은 지속적으로 종료되지 않습니다 - 일부 플랫폼에 종료 않지만, 다른 사람에 그것은 단지 이전 지점에서 다시 시작하고 prefrences의 데이터를 모두 잃었다. – digerati32

답변

3

안드로이드는 기본적으로 마지막 활성 활동을 다시 시작합니다. 프로세스를 다시 시작하지 않고 응용 프로그램을 수정하여 데이터가 없어도 활동이 정상적으로 종료되거나 종료되지 않도록하는 것이 더 좋습니다. 당신이 절대적으로 일부 데이터 (의도 엑스트라)에 따라 더 기본값이없는 경우, 당신은 그냥 사용할 수없는 경우 finish() 전화, 또는 주/부모 활동을 시작할 수 있습니다.

또 다른 방법은 ACRA를 사용하여 충돌을보고 한 후에 주 활동 등을 다시 시작하는 자체 기본 예외 처리기를 갖는 것입니다 (ACRA의 bugtracker에서이 기능 요청이 있다고 생각합니다).

+0

내 응용 프로그램을 수정하고 싶지만 불행히도 이미 배포되었으며 ACRA를 추가하여 예외를 잡았습니다.하지만 아무 일도 일어나지 않으면 강제로 응용 프로그램을 종료하고 싶습니다. ACRA를 확인했는데 그 기능을 찾지 못했습니다 ...아직 구현되지 않았다고 가정합니까? – digerati32

+1

배포 된 것이므로 문제를 해결하고 다시 배포한다는 의미는 아니므로 사람들은 기꺼이 응용 프로그램을 업데이트하여 충돌을 수정합니다. –

+0

그것은 어떤 OS 버전 (또는 전화기에 의해 어떻게 구현되었는지)에 따라 응용 프로그램이 충돌 할 경우 응용 프로그램을 닫습니다. ACRA를 사용하더라도 응용 프로그램을 강제 종료 할 수있는 방법을 찾지 못했습니다. 당신이 할 수있는 대부분의 일은 ACRA가 현재 "조용한"사고로 대화창이 나타나지 않도록하는 것입니다. ACRA를 설치 한 상태에서 업데이트를 추가 했으므로 충돌이 발생했을 때의 이유를 얻을 수있을 것으로 기대됩니다. 나는 당신의 질문을 옳은 것으로 표시 할 것입니다. 왜냐하면 그것의 가장 정확한 것 ... 답변이 없기 때문입니다. – digerati32

1

이 질문은 조금 오래 알고 있지만, 미래의 참조 및 Google 직원, 여기 찾기 어려운, 유래 질문 서로 완전한 대답 : Android App Restarts upon Crash/force close


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); 
    } 
} 

()는 일반적으로 당신은 당신이 새 스레드 (비동기 또는 ...을 시작하지 않는 한 새로운 만들 수 있다면, 당연히 당신은 스레드에 대해 알고, 하나 있습니다) DefaultUncaughtExceptionHandler

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

기억하십시오! 응용 프로그램을 개발하는 마지막 단계에서 수행하십시오. 예외를 처리하기 전에 하나씩 처리하십시오. DefaultUncaughtExceptionHandler

+0

우리는 ACRA뿐만 아니라 전체 애플리케이션을 다시 시작해야합니다. –

관련 문제