IT박스

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

itboxs 2020. 8. 17. 08:29
반응형

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(OldActivity.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);

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

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


One possible solution what I can suggest you is to add android:launchMode="singleTop" in the manifest for my ProfileActivity. and when log out is clicked u can logoff starting again you LoginActivity. on logout u can call this.

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

You can try finishAffinity(), it closes all current activities and works on and above Android 4.1


I am also facing the same issue..

in the login activity what i do is.

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

on logout

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

This works well but when i am in the ActivityLoggedIn and i minimize the app and click on the launcher button icon on the app drawer, the MainActivity starts again :-/ i am using the flag

android:LaunchMode:singleTask 

for the MainActivity.


Use the following for activity

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

remove CLEAR_TASK flag for fragment use.

I hope this may use for some people.


Just keep

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

None of the intent flags worked for me, but this is how I fixed it:

When a user signs out from one activity I had to broadcast a message from that activity, then receive it in the activities that I wanted to close after which I call finish(); and it works pretty well.


Try this it will work:

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

In API level 11 or greater, use FLAG_ACTIVITY_CLEAR_TASK and FLAG_ACTIVITY_NEW_TASK flag on Intent to clear all the activity stack.

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

Use this

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

add to Manifest for your activity android:launchMode="singleTask"

참고URL : https://stackoverflow.com/questions/12947916/android-remove-all-the-previous-activities-from-the-back-stack

반응형