Android : 스택에 저장하지 않고 활동 열기


94

메인과리스트의 두 가지 활동이 있습니다.

Main에서 List를 열 수 있습니다. 목록에서 Main을 열 수 있습니다.

List를 열 때마다 '역사'에 저장 되지 않도록 하고 싶습니다 . 따라서 Main에서 뒤로를 누르면 List로 돌아갈 수 없습니다 .

가능할까요?


11
'목록'시작 '주'다음 경우는 호출 finish()후 즉시 startActivity(...). 이렇게하면 사용자가 'main'에서 BACK을 누르면 돌아갈 것이 없습니다.
Squonk

이 통지 탐색하지만 개념을 적용 할 수 developer.android.com/guide/topics/ui/notifiers/...
케빈 리

답변:


160

목록의을 시작할 때 다음 과 같이 플래그를 Activity설정 하십시오 Intent.

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

FLAG_ACTIVITY_NO_HISTORY플래그는 새를 유지 Activity역사 스택에 추가되지.

NB : @Sam이 지적했듯이 i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);대신 사용할 수 있습니다 . 기능적 차이는 없습니다.


2
이 방법에 대한 간단한 설명 :이 방법은 활동이 2 개만 있으면 완벽하게 작동합니다. 그러나 목록 활동이 다른 활동 (예 : 세 번째 활동)을 시작할 수있는 경우 세 번째 활동에서 뒤로 버튼을 누르면 목록 활동이 아닌 기본 활동으로 돌아갑니다
VinceFR

과연. 불행히도이를 피할 수있는 방법은 없습니다. Intent" Activity원점으로 돌아 가지 않는 경우에만 기록에 추가"라는 플래그 가 없습니다 .
에릭

1
아니요,하지만 FLAG_ACTIVITY_NEW_TASK 플래그가 작업을 수행합니다. 목록 활동은 기록에 추가되지만 항상 맨 위에 있으므로 기본 활동에서 뒤로 누르면 목록이 표시되지 않습니다. Activity
VinceFR

7
당신이 사용하는 어떤 특별한 이유가 있습니까 setFlags()getFlags()대신은 Intent.addFlags()?
Sam

1
@VinceFR 그것은 내가 원하는 것입니다! a-> b-> c로 직접 돌아가서 c-
realtebo

90

매니페스트 파일에서 다음을 추가합니다.

android:noHistory="true" 

스택에 보관하고 싶지 않은 활동에.


플래그 no_history로 활동을 시작하는 것과 다른 점이 있습니까?
realtebo 2012 년

1
당신이 당신의 질문에서 말했듯이 "목록을 열 때마다 '기록'에 저장되지 않습니다."따라서 응용 프로그램을 다시 열 때마다 주요 활동으로 이동합니다
Marcin S.

@MarcinS. 앱이 최근 앱 목록에 없으면 작동하지 않습니다. 왜 이런 일이 일어나고 있는지 설명해 주시겠습니까?
Ajit Kumar Dubey 2015-08-05

1
그렇다면이 두 가지 접근 방식 (매니페스트 및 플래그)의 차이점은 무엇입니까?
pumbosha

@pumbosha Manifest 접근 방식은 항상 활동을 기록에서 제외합니다. 플래그 접근 방식을 사용하면 런타임에 해당 동작을 제어 할 수 있습니다.
John Crawford

27

지우기와 함께 새 작업을 사용하십시오. 이것은 다른 옵션이 없었을 때 제 경우에 효과가있었습니다.

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

전체 기록 스택을 지우고 Android에서 새 활동 시작


1
이것은 좋겠지 만, 시스템의 "작업 변경"애니메이션을 멈출 수있는 방법이 있습니까? 안타깝게도 FLAG_ACTIVITY_NO_ANIMATION을 추가해도 방지되지 않습니다!
androidguy

이것이 애플리케이션 속도에 영향을 미칩니 까?
Acauã Pitta 2019 년

23

다른 활동을 연 직후 활동에서 finish ()를 호출하면 완료된 활동이 스택에서 제거되는 것 같습니다.

예를 들면 :

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();

휴대 전화가 너무 빠르지 않으면 이전 활동이 사라지는 것을 볼 수 있습니다.
놀란

활동을 시작하기 전에 끝내야하는 @Nolan
헨릭 Bøgelund Lavstsen

7

내 특별한 경우 FLAG_ACTIVITY_NO_HISTORY에는 작동하지 않았습니다. 어느 쪽도하지 않았다 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK혼자 스스로 일하여.

그러나 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK함께 일했다.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

4

늦은 답변이지만 다른 답변에 깊이를 더합니다. 모든 것은 그 활동에서 시작된 다른 활동으로 무엇을하고 싶은지에 달려 있습니다.

옵션 1-이 하나의 활동에만 호출 활동 기록이 없어야합니다.

그런 다음 다음을 수행하십시오.

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

옵션 2-특정 활동에서 시작된 모든 활동에는 기록이 없어야합니다.

그런 다음 호출 활동의 매니페스트를 추가합니다.

android:noHistory="true" 

그러나 새 활동에 기록을 남기려면 수동으로 플래그를 제거해야합니다.

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

다른 답변이 정리되기를 바랍니다. :)


3

Kotlin에서이 작업을 수행하는 방법을 추가하고 싶었습니다.

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
Kotlin 방식의 추가 : Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

2

활동이 이미 실행중인 경우 FLAG_ACTIVITY_CLEAR_TOP를 시도하십시오.

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


-4

'반환'기능을 중지하기 위해 특정 활동의 뒤로 버튼을 재정의 할 수 없습니까?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
이러지마 특정 목적을 위해 BACK을 가로채는 것은 허용되지만 순전히 BACK 프레스를 조용히 소비하기 위해 수행하고 종료를 방지하는 Activity것은 좋은 습관이 아닙니다.
Squonk

1
전적으로 동의 ^ 단지 옵션.
Broak

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