programing

Android Stack 활동을 지우는 방법은 무엇입니까?

copyandpastes 2021. 1. 17. 12:34
반응형

Android Stack 활동을 지우는 방법은 무엇입니까?


Android에 여러 활동이있는 애플리케이션이 있고 사용자가 메뉴 버튼을 눌러 로그 아웃 할 수 있기를 원합니다. 내가 가진 문제는

A) Android는 애플리케이션을 종료하도록 허용하지 않습니다.
B) 사용자를 LoginActivity다시 보내더라도 언제든지 뒤로 누르고 이전 활동으로 돌아갈 수 있습니다.

나는 이미 다음 두 가지 플래그로 활동을 시작하려고 시도했습니다.

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

나는 또한 그들 각각을 스스로 시도했습니다.

나는 또한 다른 StackOverflow 질문에서 읽은 finish()호출 시도했습니다 startActivity(intent).


로그인 활동에서 뒤로 버튼을 재정 의하여 활동을 완료하는 대신 앱을 숨 깁니다.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

또한 루트 활동에 android : alwaysRetainTaskState = "true"를 설정해야합니다. 그래야 Android가 사용자로부터 30 분 동안 활동이 없으면 스택 (로그인 활동 포함)이 삭제되지 않습니다.

그런 다음 성공적인 로그인이 있으면 finish ()를 호출하십시오.


이것은 비트 OR이어야합니다. 그렇지 않으면 이전 플래그를 덮어 쓰게됩니다.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

이렇게 :

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

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


추가 android:noHistory="true"귀하에 속성을 <activity>에서 AndroidManifest.xml이 같은 :

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

당신이 사용하는 경우 Android API 11이상, 당신은 스택을 취소 한 다음 코드를 사용할 수 있습니다.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

이것은 활동 백 스택을 지우지 않습니다.

위의 답변을 모두 따른 후에도 뒤로 버튼을 눌렀을 때 앱을 닫기 전 마지막 활동을 잠시 보여주었습니다.

이것이 내가 한 일입니다.

@Override
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

이제 내 앱은 번거 로움없이 뒤로 누를 때 종료됩니다.


설정 Intent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK플래그를 설정하지 않은 매우 유사한 경우에 저에게 효과적이었습니다. 없이 시도해 보셨습니까?


이것은 나를 위해 일합니다 :)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

예를 들어 A는 내 루트 활동입니다.

스택에서 시작 활동 E를 호출 할 때 활동 A-> B-> C-> D가 있습니다. 이제 A-> E가 있습니다.

잘 모르겠지만 :) 작동합니다.


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

이것을 작성하고 참고 : LoginActivity먼저 Launcher로 시작해야하며

런처 모드를 작성하면 플래그가 목적을 덮어 쓰므로을 제거 launchermode하고 시도해보십시오.


이 시도

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

이 코드를 사용하여 로그인 활동 (A)을 시작하는 경우 :

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

활동은 활동 스택에 있어야합니다. 그렇지 않으면이 플래그가 영향을주지 않습니다.

If we use finish() in the Login activity (A), after launching activity (B) (to avoid going back to A from B), the activity A (Login) will not be in the stack. Exactly the same happens when the login activity has "noHistory" as attribute.

So, the solution for me was a mix of other responses:

This code goes in the activity B, to avoid come back to the login activity:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
    super.onBackPressed();
}

And this code goes in the activity which call the logout function:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

ReferenceURL : https://stackoverflow.com/questions/4190429/how-to-clear-the-android-stack-of-activities

반응형