히스토리 스택에서 활동 제거
내 앱은 사용자가 앱을 처음 실행할 때 가입 활동을 보여줍니다.
- ActivitySplashScreen (게임에 오신 것을 환영합니다, 계정에 가입 하시겠습니까?)
- ActivitySplashScreenSignUp (위 정보를 입력하십시오)
- ActivityGameMain (메인 게임 화면)
따라서 사용자가 각 화면의 버튼을 클릭하면 활동이 순서대로 정확하게 실행됩니다.
사용자가 활동 # 2에서 # 3으로 이동하면 내역 스택에서 # 1 및 # 2를 완전히 지울 수 있습니까? 사용자가 # 3에 있고 뒤로 버튼을 누르면 스플래시 화면으로 돌아 가지 않고 홈 화면으로 이동합니다.
나는 작업 으로이 작업을 수행 할 수 있다고 생각합니다 (즉, # 3에서 새 작업을 시작하십시오). 그러나 더 간단한 방법이 있는지 확인하고 싶었습니다.
감사
파일 의 관련 항목에서 android:noHistory
속성 을 로 설정하면 됩니다. 예를 들면 다음과 같습니다."true"
<activity>
AndroidManifest.xml
<activity
android:name=".AnyActivity"
android:noHistory="true" />
전달을 사용하여 다음 활동을 시작하는 동안 활동 스택에서 이전 활동을 제거 할 수 있습니다. APIDemos에 이것의 예가 있지만 기본적으로 당신이하고있는 일은 call finish()
직후에 호출하는 것 startActivity()
입니다.
예, Intent.FLAG_ACTIVITY_NO_HISTORY를 살펴보십시오 .
이것은 이상적인 방법은 아닙니다. 누군가가 더 나은 방법을 가지고 있다면 그것을 구현하기를 고대 할 것입니다. 여기에 방법은 내가 이전 버전-11 SDK이 특정 작업을 수행.
분명한 시간에 떠나고 싶은 각 수업에서 다음을 수행해야합니다.
... interesting code stuff ...
Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
startActivityForResult(i, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == R.string.unwind_stack_result_id) {
this.setResult(R.string.unwind_stack_result_id);
this.finish();
}
}
스택에서 팝 체인을 설정 해야하는 것은 시작하려는 경우 이것을 호출해야합니다.
NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();
그런 다음 활동이 스택에 없습니다!
사람들을 기억하십시오. 활동을 시작한 다음 정리를 시작할 수 있습니다. 실행은 단일 (ui) 스레드를 따르지 않습니다.
API 11 이전에 작동하는 한 가지 방법은 ActivityGameMain
먼저 시작한 다음 onCreate
해당 활동에서 활동을 시작하는 것 ActivitySplashScreen
입니다. 은 ActivityGameMain
당신이 너무 빨리 시작에 대한 startActivity를 전화로 나타나지 않습니다.
그런 다음 Intent에서 다음 플래그를 설정하여 시작할 때 스택을 지울 수 있습니다ActivityGameMain
.
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
또한 이것을 ActivitySplashScreen에 추가해야합니다.
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
따라서 해당 활동을 다시 눌러도 귀하의 (으)로 돌아 가지 않습니다 ActivityGameMain
.
스플래시 화면이 다시 돌아 가지 않기를 원한다고 가정 noHistory
합니다 AndroidManifest.xml
. 그런 다음 대신 클래스에 goBackPressed
코드를 넣으십시오 ActivitySplashScreenSignUp
.
그러나 나는 이것을 깨는 몇 가지 방법을 발견했다. 알림 ActivitySplashScreenSignUp
이 표시 되는 동안 알림에서 다른 앱을 시작 하면 이전 기록이 재설정되지 않습니다.
이 문제를 해결하는 유일한 방법은 API 11입니다.
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
나는 이런 식으로 사용합니다.
Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
나는 이것에 늦었다는 것을 알고 있습니다 (질문이 제기 된 지 2 년이 지났지 만). 특정 활동을 확인하는 대신 카운트를보고 3보다 작 으면 단순히 앱을 뒤로 보냅니다 (앱을 일시 중지하고 시작하기 전에 실행중인 모든 항목으로 사용자를 반환). 소개 화면이 하나 밖에 없기 때문에 3 개 미만을 확인합니다. 또한 앱을 통해 사용자가 메뉴를 통해 홈 화면으로 돌아갈 수 있으므로 카운트를 확인하므로 스택에 소개 화면 이외의 활동이있는 경우 일반과 같은 다른 화면을 통해 백업 할 수 있습니다.
//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
//Check the activity stack and see if it's more than two deep (initial screen and home screen)
//If it's more than two deep, then let the app proccess the press
ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
int activityCount = tasks.get(0).numActivities;
if (activityCount < 3)
{
moveTaskToBack(true);
}
else
{
super.onBackPressed();
}
}
그냥 설정 noHistory="true"
에서 매니페스트 파일. 백 스택에서 활동이 제거됩니다.
매니페스트에서 다음을 추가 할 수 있습니다.
android:noHistory="true"
<activity
android:name=".ActivityName"
android:noHistory="true" />
전화 할 수도 있습니다
finish()
startActivity (..)를 호출 한 직후
아무도이 우아한 해결책을 언급하지 않은 것은 미안합니다. 이것이 정답입니다.
SplashActivity -> AuthActivity -> DashActivity
if (!sessionManager.isLoggedIn()) {
Intent intent = new Intent(context, AuthActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
finish();
} else {
Intent intent = new Intent(context, DashActivity.class);
context.startActivity(intent);
finish();
}
여기서 핵심 intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
은 중개자 용 Activity
입니다. 중간 링크가 끊어 DashActivity
지면 스택의 첫 번째 링크 와 마지막 링크입니다 .
android:noHistory="true"
Activity
콜백으로 의존 할 때 문제가 발생하기 때문에 나쁜 해결책 onActivityResult
입니다. 이것은 권장되는 솔루션이며 수락해야합니다.
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);
너무 늦었지만 도움이 되길 바랍니다. 대부분의 답변이 올바른 방향을 가리키고 있지 않습니다. 그러한 것에 대한 두 가지 간단한 플래그가 있습니다.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
안드로이드 문서에서 :
public static final int FLAG_ACTIVITY_CLEAR_TASK API 레벨 11에 추가됨
If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the
활동이 시작되기 전에 지워질 활동. 즉, 활동은 빈 작업의 새 루트가되고 이전 활동은 완료됩니다. FLAG_ACTIVITY_NEW_TASK와 함께 만 사용할 수 있습니다.
다음과 같이 startActivity (intent) 전에 this.finish ()를 호출하십시오.
Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
this.finish();
startActivity(intent);
이 시도:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
API 레벨 1 입니다. 링크를 확인하십시오 .
참고 URL : https://stackoverflow.com/questions/1898886/removing-an-activity-from-the-history-stack
'Programing' 카테고리의 다른 글
unique_ptr 인수를 생성자 또는 함수에 어떻게 전달합니까? (0) | 2020.02.27 |
---|---|
Windows 콘솔에서 cURL 명령 실행 (0) | 2020.02.27 |
CocoaPods를 사용한다면 .gitignore에 무엇이 들어가나요? (0) | 2020.02.27 |
부울을 토글하는 방법? (0) | 2020.02.27 |
'make install'의 반대말은 무엇입니까, 즉 Linux에서 라이브러리를 어떻게 제거합니까? (0) | 2020.02.27 |