programing

Android:백스택 지우기

telecom 2023. 8. 28. 20:50
반응형

Android:백스택 지우기

Android에서는 A, B, C와 같은 몇 가지 활동이 있습니다.

A에서 나는 B를 열기 위해 이 코드를 사용합니다.

Intent intent = new Intent(this, B.class);
startActivity(intent);

B에서 나는 C를 열기 위해 이 코드를 사용합니다.

Intent intent = new Intent(this, C.class);
startActivity(intent);

사용자가 C에서 버튼을 누르면 A로 돌아가서 백스택을 지우고 싶습니다(B와 C를 모두 닫습니다).그래서 사용자가 뒤로 버튼 B와 C를 사용하면 나타나지 않을 때, 저는 다음을 시도해 왔습니다.

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

하지만 제가 A 활동에 복귀했을 때 뒤로 버튼을 사용해도 B와 C는 여전히 나타납니다.어떻게 하면 피할 수 있을까요?

다음에 대한 문서에 설명된 대로 추가해 보십시오.

이 시작 모드는 FLAG_ACTIVE_NEW_TASK와 함께 사용하여 작업의 루트 활동을 시작할 경우 현재 실행 중인 해당 작업의 인스턴스를 포그라운드로 가져온 다음 루트 상태로 지웁니다.이 기능은 예를 들어 알림 관리자에서 활동을 시작할 때 특히 유용합니다.

그래서 당신의 코드는 시작할 것입니다.A다음과 같습니다.

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

관련 활동을 위해 매니페스트 파일에 추가하는 것은 어떻습니까?

android:noHistory="true"

B와 C의 활동 정의에?백스택에 추가되지 않습니다.그것이 당신이 원하는 것인지 확실하지 않습니다.

이것은 저를 오랫동안 괴롭힙니다.결국 저는 다음과 같은 방법으로 해결했습니다.

조각에서 다음을 사용합니다.

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

플래그를 더합니다.)를합니다.Intent.FLAG_ACTIVITY_CLEAR_TASK조각과 비교):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

16 Bean)부터는 API 16(Jelly Bean)을 .부터는 그냥 전화하시면 됩니다.finishAffinity().

이제 당신은 또한 전화할 수 있습니다.ActivityCompat.finishAffinity(Activity activity)호환성 라이브러리를 사용합니다.

매니페스트의 taskAffinity를 해당 활동 그룹에 고유한 패키지 이름으로 설정해야 합니다.

자세한 내용은 다음을 참조하십시오.
http://developer.android.com/reference/android/support/v4/app/.html#finishAffinity%28android.app.Activity%29http ://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

  1. 더하다android:launchMode="singleTop" A에에 대해 합니다.
  2. 사용할 경우intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)그리고.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 활동을는 A 활동을 시작합니다.

, A top.", "A"라는 의미입니다. 루에가 A는있새백생이스를 사용하여 새로운 됩니다.singleTop 한 할 수 가 A로 현재 에 있기 에)...._CLEAR_TOP).

사용해 보십시오.

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

그리고 아닌

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

응용 프로그램에 최소 sdk 버전 16이 있는 경우 finishAffinity()를 사용할 수 있습니다.

현재 작업에서 선호도가 동일한 모든 활동과 이 활동 바로 아래의 모든 활동을 마칩니다.

이것은 나를 위한 작업이다 In Top Payment 화면에서 모든 백스택 활동을 제거합니다.

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

Use finishAffinity() to clear all backstack with existing one.

Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, 

    - Activity B will be finished / removing from stack.
    - Activity A will be finished / removing from stack.
    - Activity C will finished / removing from stack.

기록 스택에서 활동 제거의 Wakka에 따라...


더하다android:noHistory="true"의 의자에 됩니다.<activity>에 시대에AndroidManifest.xml다음과 같이:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>

향후 연구를 위해 이 코드를 사용해 보십시오.

Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();

태스크 A를 시작할 때 태스크 C에서 finishAffinity()를 사용하여 백스택 작업을 지웁니다.

이 코드를 사용하여 새 활동을 시작하고 다른 모든 활동 스택 또는 백스택을 닫거나 삭제합니다.

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

저는 도움이 될 만한 흥미로운 해결책을 찾았습니다.나는 내 안에서 이것을 했습니다.onBackPressed()방법.

finishAffinity();
finish();

FinishAffinity스택에 대한 기존 활동의 연결을 제거합니다.그리고 나서 마무리는 여러분이 그 활동을 끝낼 수 있도록 도와줍니다.그러면 응용 프로그램이 종료됩니다.

코틀린에서는 자바와 거의 비슷합니다.| 기호만 또는 텍스트로 대체됩니다.그래서, 다음과 같이 쓰여 있습니다.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

재사용 가능한 고급 Kotlin:

세터 방법을 사용하여 플래그를 직접 설정할 수 있습니다.or는 자바 비트위스를 대체하는 것입니까?|.

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

이 기능을 두 번 이상 사용할 경우 Intent 확장 기능을 만듭니다.

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

그런 다음 의도를 시작하기 전에 이 함수를 직접 호출할 수 있습니다.

intent.clearStack()

다른 상황에서 플래그를 추가하는 옵션이 필요한 경우 확장 기능에 선택적 매개 변수를 추가합니다.

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

원래 질문의 코드가 잘 작동하는 것 같아서 여기 답변이 약간 오해의 소지가 있습니다.

A가 루트 활동인 경우 B 또는 C에서 FLAG_ACTIVE_CLEAR_TOP으로만 시작하면 B 및 C가 백스택에서 제거됩니다.

당신이 시작해야 할 것처럼 들립니다.Activity CActivity B을 이용하여startActivityForResult()에서 Activity C, 전화 걸기setResult(RESULT_OK)그리고.finish()그렇게Activity C종료되었습니다.Activity B당신은 그것을 가질 수 있습니다.onActivityResult()또한 전화를 걸어 응답합니다.finish()그 자체로, 그리고 당신은 다시 끌려갈 것입니다.Activity A.

저는 모든 해결책을 시도했지만 저를 위해 개별적으로 작동하는 솔루션은 없었습니다.나의 해결책은

를 선언합니다.Activity A~하듯이SingleTop을 이용하여[android:launchMode="singleTop"]Android 매니페스트에서.

이제시는동다추플가래그음안하를 합니다.A합니다.그러면 스택이 지워집니다.

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

Intent.FLAG_ACTIVITY_CLEAR_TOP이 경우에는 작동하지 않습니다.이해주요를 사용해 .(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

자세한 내용은 이 설명서를 참조하십시오.

코틀린의 예:

      val intent = Intent(this@LoginActivity, MainActivity::class.java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()

logout.addFlags(의도).FLAG_ACTIVE_CLEAR_TASK); logout.addFlags(의도).플래그_활동_NEW_TASK);

 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

덧붙여서Intent.FLAG_ACTIVITY_CLEAR_TASK문제를 해결했습니다.

Intent i = new Intent(SettingsActivity.this, StartPage.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP  | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
finish();

이 예를 사용하여 다음을 호출할 수 있습니다.Activity A부터Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

그 후에는 뒤로 버튼을 누르는 활동이 표시되지 않습니다.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | 
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finishAffinity();
finish();

에 더하여FLAG_ACTIVITY_CLEAR_TOP추가해 보십시오.Intent.FLAG_ACTIVITY_SINGLE_TOP또한:

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

지정된 코드가 올바르게 작동합니다.애플리케이션 수명 주기 샘플을 사용해 보았습니다.

FLAG_ACTIVE_CLEAR_TOP 플래그로 활동 A를 시작한 후 B와 C가 백스택에 없습니다.

전화해봤어요.activity_name.this.finish()새로운 의도를 시작한 후에 그것은 나에게 효과가 있었습니다.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

하지만 저한테는 안 될 거예요이 솔루션을 사용하기 위해 제안하는 것은 아니지만 플래그를 설정하는 것이 당신에게 효과가 없다면 당신은 이것을 시도할 수 있습니다.그래도 사용하지 않는 것이 좋습니다.

의도에 기록 플래그를 추가하지 않습니다.

활동 B에서 아래와 같이 활동 C를 시작합니다. >>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

언급URL : https://stackoverflow.com/questions/5794506/android-clear-the-back-stack

반응형