이전 활동 모두 완료


368

내 응용 프로그램에는 다음과 같은 흐름 화면이 있습니다.

Home->screen 1->screen 2->screen 3->screen 4->screen 5

이제 log out 각 화면에 공통 버튼이 있습니다.

( Home/ screen 1 / screen 2 /screen 3/ screen 4 / screen 5)

사용자가 모든 화면에서 로그 아웃 버튼을 클릭하면 모든 화면이 완료되고 새 화면 Log in이 열리기를 원합니다 .

나는 FLAG_ACTIVITY이것을 달성하기 위해 거의 모든 것을 시도했다 . 또한 stackoverflow에서 일부 답변을 겪었지만 문제를 해결할 수는 없습니다. 내 응용 프로그램이 Android 1.6에 있으므로 사용할 수 없습니다FLAG_ACTIVITY_CLEAR_TASK

문제를 해결할 방법이 있습니까?


startActivityForResult를 사용하여 중첩 된 활동을 실행합니까?
woodshy 2016 년

아니요. 모든 활동은 startActivity로 시작됩니다.
Tanmay Mandal 2016

cod가 중첩 활동에서 finishaffinitytask ()를 실행하는 동안 중첩 활동을 사용하고 있습니다. 행동을 바꾸나요? 때로는 finishaffinitytask가 실행될 때 결과 ResultInfo를 전달하지 못했습니다.
Ripal Tamboli

이 답변을 확인하시기 바랍니다, 그것은 확실히 당신이 도움이 될 것입니다 stackoverflow.com/a/25159180/2732632
Kimmi Dhingra

3
안드로이드 21은 Activity.finishAndRemoveTask ()를 도입했습니다.
Joseph Johnson

답변:


543

사용하다:

Intent intent = new Intent(getApplicationContext(), Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

이렇게하면 집 위에있는 모든 활동이 지워집니다.

사용자가 로그인하여 홈을 생성 할 때 로그인 화면을 마치고 그 화면의 맨 위에 1에서 5까지의 모든 화면이 있다고 가정합니다. 내가 게시 한 코드는 다른 모든 활동을 마치는 홈 화면으로 돌아갑니다. 인 텐트에 추가 기능을 추가하고 홈 화면 활동에서이를 읽고 완료 할 수도 있습니다 (로그인 화면을 다시 시작하거나 다른 방법으로 시작할 수 있음).

확실하지 않지만이 플래그로 로그인을 시도 할 수도 있습니다. 이 경우 활동이 어떻게 주문되는지 모르겠습니다. 따라서 현재 표시된 화면을 포함하여 현재 화면 아래의 화면을 지우는 지 확실하게 알 수 있습니다.

도움이 되었기를 바랍니다.


사용자가 첫 번째 화면을 홈 화면으로 표시하는 것이 주된 문제입니다.
Tanmay Mandal 2016

내 응답이 있으면 홈 화면으로 돌아와서 마무리해야합니다. 프로세스는 어떤 화면에서든 위의 의도를 호출합니다. 시작 화면에서 의도를 수신하고 즉시 startActivity 메소드 후에 로그인하려는 의도를 취하고 집으로 마무리합니다. 또한 전환을 표시하지 않도록 보류중인 애니메이션을 in 및 out에 대해 null로 무시할 수 있습니다.
DArkO

10
활동을로 선언하지 말고 의도에 대한 플래그로 singleInstance사용 FLAG_ACTIVITY_CLEAR_TOP|FLAG_ACTIVITY_SINGLE_TOP하는 것을 고려 하십시오. 그러면 개입 활동이 완료되고 원하는 활동이 시작됩니다 (또는 전경으로 돌아갑니다).
CommonsWare

13
@ CommonsWare intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);내 활동에 추가 해도 도움이되지 않았습니다. 개입 활동을 완료하지 못했습니다. 로그인 화면에서 다시 누르면 이전 활동을 볼 수 있습니다 Intent intent=new Intent(BaseActivity.this, Login.class);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);. 여기 내 코드가 있습니다.
Tanmay Mandal 2016

26
이 코드는 모든 활동을 지우기 위해 최상위 활동 스택 만 지 웁니다. intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
Ajay Venugopal

318

당신은 시도 할 수 있습니다 Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK. 이전의 모든 활동을 완전히 지우고 새로운 활동을 시작합니다.


11
적절한 솔루션이지만 API 11+ 만
riwnodennyk

이 추가 플래그를 사용하여 메인 활동을 표시 할 때 지연이 발생하지 않기 때문에 다시 시작하지 않으므로 훨씬 빠릅니다.
Maurizio

2
@riwnodennyk 왜 API 11 이상입니까?
Muhammad Babar

17
11 이전 버전의 경우 IntentCompat.FLAG_ACTIVITY_CLEAR_TASK를 사용하십시오
Steven Pena

2
@ono 예. 그게 당신이 필요한 전부입니다. 매니페스트에서 대상 활동의 시작 모드가 "singleTask"로 설정되어 있는지 확인하십시오.
Steven Pena

137

새 활동을 시작하기 전에 다음 코드를 추가하십시오.

finishAffinity();

또는 이전 버전의 Android에서 작동하려는 경우 :

ActivityCompat.finishAffinity(this);

12
ActivityCompat.finishAffinity (this); api <16에 대해 activity.finish ()를 호출하므로 작동하지 않습니다.
Aamir Abro

1
@Beto Caldas는 소스 코드를 직접 확인했으며 AamirAbro가 언급 한 것처럼 API <16에서는 작동하지 않습니다. API <16을 전달하는 활동을 마치면됩니다.
HendraWD

39

사용자가 열려있는 모든 활동을 종료 하려면 애플리케이션을 시작할 때 실행되는 첫 번째 활동을로드하고 다른 모든 활동을 지우고 마지막 남은 활동을 완료하는 단추를 눌러야합니다. 사용자가 종료 버튼을 누를 때 다음 코드를 실행하십시오. 내 경우에는 LoginActivity내 프로그램에서 가장 먼저 실행되는 활동입니다.

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

위의 코드는를 제외한 모든 활동을 지 웁니다 LoginActivity. 그런 다음 내부에 다음 코드를 삽입 LoginActivityonCreate(...)경우에 대해 듣고, LoginActivityEXIT '신호 전달 재현하고,이'

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

Android에서 종료 버튼을 만드는 것이 왜 그렇게 어려운가요?

Android는 사용자가 사용하는 프로그램이 백그라운드에서 실행 중인지 여부에 대해 신경 쓰지 않기를 원하기 때문에 응용 프로그램에 "종료"버튼이 없도록 권장하지 않습니다.

Android OS 개발자는 프로그램이 예기치 않게 종료되고 전화기의 전원이 꺼진 상태에서 살아남을 수 있기를 원하며, 사용자가 프로그램을 다시 시작하면 중단 된 곳에서 바로 가져옵니다. 따라서 사용자는 응용 프로그램을 사용하는 동안 전화를 받고 더 많은 리소스를 위해 응용 프로그램을 해제해야하는지도를 열 수 있습니다.

사용자가 응용 프로그램을 다시 시작하면 중단없이 중단 된 부분을 바로 가져옵니다. 이 종료 버튼은 활동 관리자의 전원을 사용하여 자동으로 관리되는 Android 프로그램 수명주기에 문제를 일으킬 수 있습니다.


31
Intent intent = new Intent(this, classObject);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

이것은 모든 안드로이드 버전에서 작동합니다. 어디 IntentCompat클래스는 안드로이드 지원 라이브러리에 추가.


IntentCompat.FLAG_ACTIVITY_CLEAR_TASK인식되지 않는 Intent대신을 (를 ) 사용하십시오 IntentCompat.
CoolMind

30

활동에 다음을 사용하십시오

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

프래그먼트 사용을 위해 CLEAR_TASK 플래그를 제거하십시오.

이것이 일부 사람들에게 사용될 수 있기를 바랍니다.


24

나는 늦었다 고 생각하지만 간단하고 짧은 대답이 있습니다. Activity에는 finishAffinity () 메소드가 있으며 현재 활동 및 모든 상위 활동을 완료하지만 Android 4.1 이상에서만 작동합니다.

API 16+의 경우

finishAffinity();

16 세 미만인 경우

ActivityCompat.finishAffinity(YourActivity.this);

그것이 도움이되기를 바랍니다!


21

에서 developer.android.com :

public void finishAffinity ()

API 레벨 16에서 추가됨

현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오. 이것은 일반적으로 응용 프로그램을 다른 작업 (예 : 이해하는 콘텐츠 유형의 ACTION_VIEW에서)으로 시작할 수 있고 사용자가 위로 탐색을 사용하여 현재 작업에서 자체 작업으로 전환 한 경우에 사용됩니다. 이 경우 사용자가 두 번째 응용 프로그램의 다른 활동으로 이동 한 경우 모든 작업을 작업 스위치의 일부로 원래 작업에서 제거해야합니다.

이 마무리를 통해 이전 활동에 결과를 전달할 수 없으며 그렇게하려고하면 예외가 발생합니다.


19

참고로, 알아두면 좋은
점이 답변은 작동합니다 ( https://stackoverflow.com/a/13468685/7034327 )

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

반면 이것은 작동하지 않습니다

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

.setFlags() 이전 플래그를 교체하고 새 플래그를 추가하지 않습니다 .addFlags().

그래서 이것은 또한 작동합니다

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

setFlag와 addFlag의 차이점에 대한 훌륭한 설명, 감사합니다
Pelanes

13

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

현재 작업에서 동일한 선호도를 가진 바로 아래의 모든 활동뿐만 아니라이 활동을 완료하십시오.

상단 결제 화면에서 모든 백 스택 액티비티를 제거합니다.

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

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


10

내가 이것을 위해 구현 한 솔루션 (어딘가에서 스택 오버플로에서 찾았다 고 생각하지만 기억이 나지 않습니다.

모든 활동에서 다음을 수행하십시오.

// Clear your session, remove preferences, etc.
Intent intent  = new Intent(getBaseContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

그런 다음 LoginActivity에서 onKeyDown을 덮어 씁니다.

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

3
그것은 일반적으로 매우 좋지 않은 아이디어입니다. 나는 당신에게 경험에서 말하고 있습니다 :)
Martin Marconcini

10

앱의 마지막 화면에있는 로그 아웃 버튼의 경우, 로그 아웃 버튼 리스너에서이 코드를 사용하여 열려있는 모든 이전 활동을 완료하면 문제가 해결됩니다.

{
Intent intent = new Intent(this, loginScreen.class);
ntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}

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

6
FLAG_ACTIVITY_CLEAR_TASK가번인 이유는 무엇입니까?
Choletski

1
내가 이해 한 바에 따르면 .setFlags는 이전 플래그를 대체하고 플래그를 추가하지 않습니다. .addFlags를 사용하고 싶습니까? 위의 모든 코드를 i1.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 전멸됩니다
iOSAndroidWindowsMobileAppsDev

addFlags Works 나를 위해
Jamil

1
setFlags모든 이전을 대체하므로 last setFlags는 유효하며 이전은 대체됩니다. 따라서 전화 할 필요가 없습니다i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
mtrakal

8

다음 IntentCompat과 같이 사용할 수있는 동일한 문제가 있습니다 .

import android.support.v4.content.IntentCompat;
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

이 코드는 저에게 효과적입니다.

안드로이드 API 17


8

내 경우에는 finishAffinity()다음과 같은 마지막 활동에서 함수를 사용 합니다.

finishAffinity()
startHomeActivity()

도움이 되길 바랍니다.



6

로그인-> 홈-> 화면 1-> 화면 2-> 화면 3-> 화면 4-> 화면 5

화면 4 (또는 기타)->

StartActivity (로그인)
FLAG_ACTIVITY_CLEAR_TOP


2
뒤로 버튼을 누르면 이전의 모든 활동이 순서대로 표시됩니다.이 활동을 종료해야합니다. 로그 아웃 버튼을 클릭하면 스택에 활동이 하나만 있고 로그인 활동이됩니다. 사용자가 홈 화면에서 시작합니다.
Tanmay Mandal 2016

6

API> = 15 ~ API 23 간단한 솔루션.

 Intent nextScreen = new Intent(currentActivity.this, MainActivity.class);
 nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
 startActivity(nextScreen);
 ActivityCompat.finishAffinity(currentActivity.this);

모든 사람이 혜택을 누릴 수 있도록 답을 정교하게하십시오.
Shubhamoy

5

startActivityForResult()이전 액티비티에서 사용하는 경우 모든 액티비티에서 내부 메소드를 재정의 OnActivityResult()하고 호출하십시오 finish();. 그러면 작업이 수행됩니다.


아니요, 나는 startActivity단지 사용 하고 있습니다.
Tanmay Mandal 2016

onActivityResult각 활동 을 유지하기가 어려울 것입니다. 나는 DArkO의 제안을 구현하고 내 목표와 도움을 주셔서 감사합니다.
Tanmay Mandal 2018

3

사용자가 로그 아웃 버튼을 클릭하면 다음 코드를 작성하십시오.

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

또한 로그인 후 새로운 활동을 호출하면 finish ()를 사용하지 마십시오.


2

단순히 로그인 화면을 종료 할 때가 아니라 로그인 화면에서 나올 때입니다.

그런 다음 모든 앞으로의 활동에서 이것을 로그 아웃에 사용하십시오.

final Intent intent = new Intent(getBaseContext(), LoginScreen.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

완벽하게 작동합니다.


1

사용자를 로그인하고 screen 1거기에서 다른 화면으로 이동하면

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

뒤로 버튼을 누르면 이전의 모든 활동이 순서대로 표시됩니다.이 활동을 종료해야합니다. 로그 아웃 버튼을 클릭하면 스택에 하나의 활동 만 있고 로그인 활동이됩니다.
Tanmay Mandal 2016

이 동작 을 원하면 각 활동 (로그인 활동 제외)에서 재정의 onKeyDownonBackPressed(또는 onKeyDownAndroid 버전 <2.0을 지원하려는 경우) 위와 같이 재정의해야합니다 startActivity(login).
Gabriel Negut 2016 년

스택의 모든 활동을 완료하는 로그인 화면으로 이동하는 버튼이 있습니다. 가능합니까?
Tanmay Mandal 2016

1

이 방법을 찾았습니다. 모든 기록을 지우고 종료합니다.

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
Intent intent = new Intent(getApplicationContext(), SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

finish();
System.exit(0);

1

나는 늦었다 고 생각하지만 간단하고 짧은 대답이 있습니다. Activity에는 finishAffinity () 메소드가 있으며 현재 활동 및 모든 상위 활동을 완료하지만 Android 4.1 이상에서만 작동합니다.

API 16+의 경우

finishAffinity ();

16 세 미만인 경우

ActivityCompat.finishAffinity (YourActivity.this);

그것이 도움이되기를 바랍니다!

shareedit가 5 월 27 일 18시 8:03에 답변

Akshay Taru


0

이 솔루션은 API 수준에도 불구하고 모든 장치에서 작동하는 것으로 나타났습니다 (<11의 경우에도 해당)

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

0

이전 활동을 모두 닫고 메모리를 지우는 가장 좋은 방법

finishAffinity()
System.exit(0);

0
startActivity(
                Intent(this, LoginActivity::class.java)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    .addFlags(FLAG_ACTIVITY_CLEAR_TASK)
            )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.