이전 활동으로 돌아 가지 못하게하는 방법?


210

전화기에서 BACK 버튼을 누르면 특정 활동이 이전 활동으로 돌아 가지 않게하려고합니다.

특히, 로그인 및 가입 화면이 있는데, HomeScreen성공적인 로그인 / 가입이 발생했을 때 호출되는 새로운 활동을 시작 합니다. HomeScreen이 시작되면 BACK 키를 눌러 사용자가 로그인 또는 가입 화면으로 돌아 가지 못하게하고 싶습니다.

을 사용해 보았지만 Intent.FLAG_ACTIVITY_NO_HISTORY응용 프로그램에 Facebook 통합 기능이 있으므로 'Facebook으로 로그인'을 사용할 때 Facebook은 초기 로그인 화면으로 돌아 가야하므로 이러한 활동 기록을 유지해야합니다.

HomeScreen버튼을 눌렀을 때 응용 프로그램을 직접 완료하기 위해 BACK 버튼의 동작을 재정의하려고 생각했습니다.

@Override
public void onBackPressed() {
    finish();
}

그러나 그것은 또한 작동하지 않습니다.


1
명확히하기 위해 페이스 북을 제외한 모든 사람의 행동을 다시 포착하려고합니까?
— havexz

2
어떤 의미에서 그렇습니다. 그러나 실제로 로그인이 성공하고 HomeScreen이 열린 후 원하는 것은 BACK 버튼을 눌러 로그인 화면으로 돌아갈 수 없습니다. 예를 들어 Twitter 또는 Foursquare와 마찬가지로 해당 앱에 로그인하면 로그 오프 할 때까지 (로그인 후 BACK을 눌러도) 로그인 페이지가 표시되지 않습니다.
— ecem

답변:


345

내 제안은 사용자가 다시 가고 싶지 않은 활동을 끝내는 것입니다. 예를 들어, 로그인 활동에서을 호출 한 직후을 호출 startActivity하십시오 finish(). 사용자가 뒤로 버튼을 누르면 로그인 활동에서 스택에서 종료되었으므로 로그인 활동으로 이동할 수 없습니다.


2
이전 활동의 스레드가 계속 실행되도록하려면 어떻게합니까?
— AlleyOOP

2
당신은 내 접근 방식으로 가고 싶지 않을 것입니다. finish ()를 호출하면 활동이 종료됩니다. 진행할 활동에서 실행하려는 프로세스를 시작할 수 있습니까?
— 코더

7
참고 : finish공유 전환 중 전화를 걸면 이전 활동으로 인해 출혈이 생길 수 있습니다. 당신이있는 경우 예를 들면, HomeActivity-> IntermediateActivity-> FinalActivity, 당신은 전화 finish()에 IntermediateActivity시작 후 즉시 FinalActivity당신이 나타납니다 HomeActivity짧은 순간을 위해.
— David Murdoch

101

다음 솔루션은 일반적인 로그인 / 주요 활동 시나리오 또는 차단 화면 구현에 매우 유용 할 수 있습니다.

이전 활동으로 돌아 가지 않고 앱을 최소화하기 위해 다음 onBackPressed()과 같이 재정의 할 수 있습니다 .

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

moveTaskToBack(boolean nonRoot)다시 스택을 그대로두고 작업 (모든 활동)을 백그라운드로 놓습니다. 사용자가 홈 버튼을 누른 것과 동일합니다 .

매개 변수 boolean nonRoot-false 인 경우 활동이 작업의 근본 인 경우에만 작동합니다. 참이면 작업의 모든 활동에 적용됩니다.


3
기록이 그대로 유지되므로 로그인 화면에 적합합니다.
— Hackmodford

고마워요, 나는 약 3 일 동안 이것을 찾으려고 노력했습니다. android : noHistory = "true"때문에 Activity에 대한 활동 플래그가 예상대로 작동하지 않으며 (noHistory 플래그가 최소화 후 활동을 다시 생성 함) finish ()가 때때로 작동하지 않았지만 여전히 이해하지 못하는 이유가 있습니다.
— Denshov

37

정확히 무엇을 원하는지 잘 모르겠지만 가능해야 할 것처럼 들리며 이미 올바른 길을 가고있는 것처럼 들립니다.

도움이 될만한 몇 가지 링크는 다음과 같습니다.

안드로이드에서 뒤로 버튼 비활성화

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

일부 활동으로 돌아가려면 어떻게합니까?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
내 질문에 설명하려고 시도한 Facebook 문제와 의견 중 하나 때문에 noHistory 옵션을 사용할 수 없습니다. 그러나 BACK 버튼을 사용하는 것은 비활성화하지 않지만 전체 응용 프로그램을 종료하는 것처럼 System.exit(0)호출됩니다 (최상의 실행 방식이 아니라는 것을 알고 싶었습니다).
— ecem

감사합니다. 내가 여기에 제안한 것만으로는 돌아올 필요가 없습니다. super.onBackPressed ();를 제거하고 메소드를 비워 두십시오. 잘 작동합니다
— hyperCoder

20

사례에 대한 두 가지 해결책이 있습니다. 활동 A는 활동 B를 시작하지만 활동 B의 활동 A로 돌아가고 싶지는 않습니다.

1. 백 스택에서 이전 활동 A를 제거했습니다.

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. 활동 B에서 사용 안함 돌아 가기 단추 조치.

다음과 같이 돌아가는 이벤트를 방지하는 두 가지 방법이 있습니다.

1) 추천 접근법

@Override
public void onBackPressed() {
}

2) onKeyDown 메서드 재정의

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

도움이 되길 바라지 만 여전히 상황에 따라 달라집니다.


3
onBackPressed ()를 비활성화하는 것이 나쁜 사용자 경험이 아닙니까?
— C. Skjerdal

그것은 당신이 만들고자하는 것에 전적으로 달려 있습니다. 앱 기능에는 이것이 필요합니다.
— user3099225

를 사용하여 첫 번째 방법을 완전히 잊어 버린 방법이 놀랍습니다 finish(). nohistory속성, 인 텐트 플래그, 부모 활동 매니페스트 태그 등으로 불필요하게 생각했습니다! 바보, 대답 주셔서 감사합니다!
— varun

8

이미 많은 훌륭한 해결책이 제안되었으므로, 더 나쁜 설명을하려고 노력하십시오.

이전 활동으로 돌아가는 것을 건너 뛰는 방법 ?

Backstack에서 이전 활동을 제거하십시오. 단순한

Backstack에서 이전 활동을 제거하는 방법?

요구 finish() 방법

정상적인 흐름 :

여기에 이미지 설명을 입력하십시오
모든 활동은 Backstack으로 알려진 스택에 저장됩니다.
새 Activity ( startActivity(...))를 시작 하면 새 Activity가 스택 맨 위로 밀리고 뒤로 버튼을 누르면 Activity가 스택에서 팝됩니다.
한 가지 중요한 점 은 뒤로 버튼을 눌렀을 때finish(); 내부적으로 메소드가 호출 입니다. 이것이 onBackPressed () 메소드의 기본 동작입니다.

활동 B를 건너 뛰고 싶다면?

즉 A <--- C

활동 B에서 finish();메소드를 추가하면 startActvity(...)됩니다.

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

여기에 이미지 설명을 입력하십시오


6

finish()전체 응용 프로그램이 아닌 현재 활동을 닫는 방법을 제공합니다. 또한 응용 프로그램을 종료하는 방법을 찾지 않는 것이 좋습니다. 약간의 조언.

당신은 함께 시도 했습니까 Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? Intent활동 을 시작할 때이 플래그를 사용하십시오 !


2
FLAG_ACTIVITY_NO_HISTORYFacebook으로 로그인을 사용할 때 LoginScreen이 Facebook의 콜백을 캡처하지 못하게합니다. 포커스가 LoginScreen에서 벗어나면 다시 시작할 수 없습니다 (이력이 없기 때문에). 그러나 나는 그것을 시도하지 않았다 Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS, 나는 그것을 검사 할 것이다, 감사합니다!
— ecem

또한 finish()방법 에 대해 감사드립니다 .
— ecem

4

넣어 finish()직후

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
이것이 기본적으로 4 년 전의 대답이 말한 것입니다.
— TylerH

3

paulsm4의 답변이 맞습니다. 의 경우 onBackPressed()는 반환 단지는 뒤로 버튼이 비활성화됩니다. 그러나 유스 케이스를 고려할 때 더 좋은 방법은 활동 논리를 뒤집는 것입니다. 즉, 가정 활동을 주요 활동으로 만들고 사용자가 로그인했는지 확인하고 그렇지 않은 경우 로그인 활동을 시작하십시오. 기본 활동에서 뒤로 버튼을 재정의하면 대부분의 사용자가 뒤로 밀 때 앱이 혼란스럽고 앱이 아무것도하지 않기 때문입니다.



3

이 방법은 잘 작동합니다

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

2

onKeyDown 메서드를 재정의하고 뒤로 버튼을 눌렀는지 확인하십시오.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

당신이 만들 때 onBackPressed()그냥 제거 super.onBackPressed();하면 작동합니다


1

놓다

finish();

ActivityStart 직후에 활동을 중지하여 활동으로 돌아갈 수 없습니다. 그런 다음 추가

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

당신이 시작하는 활동에.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.