>source

3 가지 활동이 포함 된 매우 간단한 프로젝트를 만들었습니다.
활동 1 버튼이 활동 2로 이동할 수 있습니다
활동 2 버튼 3 활동으로 갈 수 있습니다
활동 3에 버튼이 충돌했습니다

충돌 버튼에 throw exception 를 설정하려고합니다.

buttonCrash.setOnclickListener (new View.OnClickListener() {
    @Override
    public void onClick(View v){
        throw new NullPointerException();
    }
});

크래시 후 다시 열기를 클릭하면 액티비티가 액티비티 2로 돌아갑니다. 앱이 다시 시작되거나 액티비티 스택을 지우는 방법은 무엇입니까?

핸들 예외 클래스를 만들려고합니다 :

public class MyExceptionHandler implements Thread.UncaughtExceptionHandler {
  private Activity activity;
  public MyExceptionHandler(Activity a) {
    activity = a;
  }
  @Override
  public void uncaughtException(Thread thread, Throwable ex) {
    Intent intent = new Intent(activity, MainActivity.class);
    intent.putExtra("crash", true);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
      | Intent.FLAG_ACTIVITY_CLEAR_TASK
      | Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(MyApplication.getInstance().getBaseContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager mgr = (AlarmManager) MyApplication.getInstance().getBaseContext().getSystemService(Context.ALARM_SERVICE);
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
    activity.finish();
    System.exit(2);
  }
}

그러나 충돌 대화 상자를 먼저 표시해야하지만 다시 열기를 클릭하여 다시 열 수 있지만 앱이 갑자기 다시 시작됩니다.

  • 답변 # 1

    시도는 기본 활동 홈과 기본값을 정의하십시오. 매니페스트의 활동에서 인 텐트 필터에 아래 코드를 추가하십시오.

    <category android:name="android.intent.category.HOME" />
    <category android:name="android.intent.category.DEFAULT" />
    
    

  • 답변 # 2

    모든 활동 전환시 활동 지우기 작업 플래그 추가

    Intent intent = new Intent(this,yourclass.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    
    

  • 답변 # 3

    두 번째 활동에 finish () 함수 추가

  • 답변 # 4

    활동 1 통과 확인 사용

    public static boolean DOING_PASS = false;
    
    

    세트 DOING_PASS   onStart 내에서 사실입니다   activity 1 에서

    @Override
    void onStart(){
        DOING_PASS = true;
    }
    
    

    onCreate 내부의 활동 1을 제외한 모든 활동을 확인할 수 있습니다.

    if(Activity1.DOING_PASS){
        // do normal
    }
    else{
        Intent i = new Intent(this, Activity1.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP || Intent.FLAG_ACTIVITY_CLEAR_TASK || Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
    }
    
    

관련 자료

  • 이전 android - BottomSheetDialogFragment의 둥근 모서리 API <21에서 작동하지 않음
  • 다음 testing - Maven Surefire를 사용하여 다른 JVM에서 JUNIT 테스트 실행