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


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.