[android] Android : 백 스택에서 모든 이전 활동 제거

프로필 활동 에서 로그 아웃 버튼을 클릭 할 때 사용자가 새 자격 증명을 사용해야 하는 로그인 페이지로 이동 하고 싶습니다 .

따라서이 코드를 사용했습니다.

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

에서 onButtonClick로그 아웃 버튼.

그러나 문제는 로그인 활동에서 장치 뒤로 버튼을 클릭하면 ProfileActivity로 이동한다는 것입니다. LoginActivity에서 장치 뒤로 버튼을 누르면 응용 프로그램이 닫힐 것으로 예상했습니다.

내가 뭘 잘못하고 있죠?

또한 android:launchMode="singleTop"LoginActivity 의 매니페스트에 추가 했습니다.

감사합니다



답변

여기 에서 제안 된 솔루션 이 저에게 효과적이었습니다.

자바

Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Kotlin

val i = Intent(this, NewActivity::class.java)
// set the new task and clear flags
i.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(i)

그러나 API 레벨> = 11이 필요합니다.


답변

다음은 로그 아웃 버튼을 사용할 때 애플리케이션의 모든 활동을 지우는 한 가지 솔루션입니다.

활동을 시작할 때마다 다음과 같이 시작하십시오.

Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class);
startActivityForResult(myIntent, 0);

전체 앱을 닫으려면 다음을 수행하십시오.

setResult(RESULT_CLOSE_ALL);
finish();

RESULT_CLOSE_ALL은 모든 활동을 닫고 싶다는 신호를 보내는 고유 한 정수가있는 최종 전역 변수입니다.

그런 다음 모든 활동의 onActivityResult(...)콜백을 정의 하여 활동이 RESULT_CLOSE_ALL 값과 함께 반환되면 다음도 호출합니다 finish().

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

이것은 모든 활동을 닫는 계단식 효과를 유발합니다.

그러나 이것은 해킹이며 사용 startActivityForResult하도록 설계되지 않은 방식으로 사용합니다.

이를 수행하는 더 좋은 방법은 다음과 같이 브로드 캐스트 수신기를 사용하는 것입니다.

로그 아웃시 활동 내역 스택을 지우고 “뒤로”버튼이 로그인 전용 활동을 열지 못하도록합니다.

다른 방법에 대해서도 다음 스레드를 참조하십시오.

Android : 백 스택 지우기

모든 이전 활동 완료


답변

활동 스택을 완전히 지우려면 TaskStackBuilder를 사용하여 새 작업 스택을 만들려고합니다. 예를 들면 다음과 같습니다.

Intent loginIntent = LoginActivity.getIntent(context);
TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities();

이렇게하면 새롭고 깨끗한 작업 스택이 생성 될뿐만 아니라 LoginActivity에 상위 활동이있는 경우 “up”버튼이 제대로 작동 할 수 있습니다.


답변

finishAffinity()API 16에 추가되었습니다 ActivityCompat.finishAffinity(). 이전 버전에서 사용 합니다. 인 텐트를 사용하여 활동을 시작하고 현재 활동을 완료 할 때. 이제 ActivityCompat.finishAffinity()대신 사용하십시오 finish(). 현재 활동 아래의 모든 누적 활동을 완료합니다. 그것은 나를 위해 잘 작동합니다.


답변

나를 위해 일한 것

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);


답변

내가 제안 할 수있는 한 가지 가능한 해결책 android:launchMode="singleTop"은 내 ProfileActivity 에 대한 매니페스트에 추가 하는 것입니다 . 클릭하면 로그 아웃하고 u는 수 로그 오프 하면 다시 시작 LoginActivity합니다.
로그 아웃시 u는 이것을 부를 수 있습니다.

Intent in = new Intent(Profile.this,Login.class);
                in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(in);
                finish();


답변

API 11+의 경우 다음 Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK과 같이 사용할 수 있습니다 .

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

모든 이전 활동을 완전히 지우고 새로운 활동을 시작합니다.