programing

전체 기록 스택을 지우고 Android에서 새 작업 시작

yellowcard 2023. 7. 29. 08:21
반응형

전체 기록 스택을 지우고 Android에서 새 작업 시작

스택에서 활동을 시작하여 전체 기록을 삭제할 수 있습니까?

상황

저는 A->B->C 또는 B->C(화면 A가 사용자 토큰을 선택하지만 많은 사용자가 단일 토큰만 가지고 있음)로 이어지는 활동 스택을 가지고 있습니다.

화면 C에서 사용자는 화면 B를 비활성화하는 작업을 수행할 수 있으므로, 애플리케이션은 이미 스택에 있는지 여부에 관계없이 화면 A로 가져가려고 합니다.그러면 A 화면이 내 애플리케이션의 스택에 있는 유일한 항목이 될 것입니다.

메모들

그 밖에도 비슷한 질문들이 많지만, 저는 이 정확한 질문에 대한 답을 찾지 못했습니다.전화해봤습니다getParent().finish()이로 인해 항상 null 포인터 예외가 발생합니다.FLAG_ACTIVITY_CLEAR_TOP활동이 이미 스택에 있는 경우에만 작동합니다.

API 레벨 11에서는 이를 위해 새로운 Intent Flag가 추가되었습니다.의도.플래그_활동_클리어_태스크

명확하게 하기 위해, 다음을 사용합니다.

자바

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

코틀린

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

API lvl <= 10의 경우 안타깝게도 아직 이에 대한 깨끗한 해결책을 찾지 못했습니다."DontHack Android Like This" 솔루션은 정말 순수한 해킹입니다.그런 짓을 해서는 안 된다.:)

편집: @Ben Pearson의 의견에 따르면 API <=10의 경우 IntentCompat 클래스를 동일하게 사용할 수 있습니다.사용할 수 있음IntentCompat.FLAG_ACTIVITY_CLEAR_TASK작업을 지우기 위해 플래그를 지정합니다.따라서 pre API 레벨 11도 지원할 수 있습니다.

사례 1: 활동 A와 B 두 가지만:

여기서 활동 흐름은 A->B입니다.B에서 뒤로 버튼을 클릭하면 애플리케이션을 닫고 A에서 B 활동을 시작해야 합니다(통화 완료). 이렇게 하면 Android가 A 활동이 애플리케이션의 로딩/플래시 화면에서 Backstack.eg 에 저장되는 것을 방지할 수 있습니다.

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

사례 2: 두 개 이상의 활동:

A->B->C->D->B와 같은 흐름이 있고 활동 D에서 오는 동안 활동 B의 뒤로 버튼을 클릭합니다.그런 경우에는 우리가 사용해야 합니다.

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

여기서 활동 B는 의도로 인해 새 인스턴스가 아닌 백스택에서 시작됩니다.FLAG_ACTIVE_CLEAR_TOP 및 의도.FLAG_ACTIVE_NEW_TASK는 스택을 지우고 최상위 스택으로 만듭니다.그래서 뒤로 버튼을 누르면 전체 애플리케이션이 종료됩니다.

Android의 최신 버전 >= API 16 사용finishAffinity()

접근 방식은 >= API 16에 적합합니다.

Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
  • 새 활동을 시작하고 모든 스택을 삭제하는 것과 같습니다.
  • 또는 주 활동/첫 번째 활동으로 재시작합니다.

저도 이 일에 몇 시간을 들였습니다... 그리고 FLAG_ACTIVE_CLEAR_에 동의합니다.TOP은 원하는 것처럼 들립니다. 실행 중인 활동을 제외한 전체 스택을 지우고, Back(뒤로) 버튼을 누르면 응용 프로그램이 종료됩니다.하지만 Mike Repass가 언급했듯이 FLAG_ACTIVE_CLEAR_TOP은 실행 중인 활동이 이미 스택에 있을 때만 작동합니다. 활동이 없을 때는 플래그가 아무 것도 하지 않습니다.

무엇을 해야 하나?시작 중인 활동을 FLAG_ACTIVE_NEW_TASK와 함께 스택에 넣습니다. 그러면 해당 활동이 기록 스택의 새 작업을 시작합니다.그런 다음 FLAG_ACTIVE_CLEAR_TOP 플래그를 추가합니다.

이제 FLAG_ACTIVE_CLEAR_TOP이 스택에서 새 활동을 찾으로 이동하면 다른 모든 활동이 삭제되기 전에 해당 활동이 풀업됩니다.

로그아웃 기능은 다음과 같습니다. 보기 매개 변수는 이 기능이 연결된 버튼입니다.

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

활동을 에, 활을시직후한작사, 용새동을 사용합니다.startActivity 꼭전요세에 전화하세요.finish()현재 활동이 새 활동 뒤에 쌓이지 않도록 합니다.

스택을 변경하면 안 됩니다.Android 뒤로 버튼은 웹 브라우저에서와 같이 작동해야 합니다.

방법을 생각해 낼 수는 있지만, 꽤나 어려운 일입니다.

  • 만들기singleTask에추으써로에 으로써.AndroidManifest예:

    <activity android:name=".activities.A"
              android:label="@string/A_title"
              android:launchMode="singleTask"/>
    
    <activity android:name=".activities.B"
              android:label="@string/B_title"
              android:launchMode="singleTask"/>
    
  • 확다하Application어디로 가야 할지에 대한 논리를 고수할 것입니다.

예:

public class DontHackAndroidLikeThis extends Application {

  private Stack<Activity> classes = new Stack<Activity>();

  public Activity getBackActivity() {
    return classes.pop();
  }

  public void addBackActivity(Activity activity) {
    classes.push(activity);
  }
}

A에서 B까지:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class); 
startActivity(this, B.class);

B에서 C까지:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class); 
startActivity(this, C.class);

C에서:

If ( shouldNotGoBackToB() ) {
  DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
  app.pop();
}

그리고 뒤로 버튼을 조작합니다.pop()스택에서.

다시 한 번 말하지만, 당신은 이것을 해서는 안 됩니다 :)

재사용 가능한 고급 코틀린:

세터 방법을 사용하여 플래그를 직접 설정할 수 있습니다.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
}

아래 코드를 사용해 보십시오.

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

사용해 보십시오.

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();

에게는 위의 어떤 방법도 통하지 않습니다.

이전의 모든 활동을 지우려면 다음과 같이 하십시오.

finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Java의 경우: -

 startActivity(new Intent(getApplicationContext(),ChooseServiceActivity.class)
                        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK));

때때로 안드로이드 에뮬레이터가 eclipse DDMS 도구를 연결하지 못하고 수동으로 시작하도록 adb를 요청할 수 있습니다.이 경우 명령 프롬프트를 사용하여 adb를 시작하거나 중지할 수 있습니다.

나는 너무 간단한 해킹을 발견했습니다. 그냥 이 새로운 요소를 추가하세요.AndroidManifest다음과 같이:-

<activity android:name=".activityName"
          android:label="@string/app_name"
          android:noHistory="true"/>

그자리의 android:noHistory스택에서 원하지 않는 활동을 지웁니다.

언급URL : https://stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android

반응형