히스토리 스택에서 활동 제거 정확하게 실행됩니다. 사용자가 활동 # 2에서 #

내 앱은 사용자가 앱을 처음 실행할 때 가입 활동을 보여줍니다.

  1. ActivitySplashScreen (게임에 오신 것을 환영합니다, 계정에 가입 하시겠습니까?)
  2. ActivitySplashScreenSignUp (위,이 정보를 입력하십시오)
  3. 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();
    }
}