400

私のアプリは、ユーザーがアプリを初めて実行したときにサインアップ アクティビティを次のように表示します。

  1. ActivitySplashScreen (ゲームへようこそ、アカウントにサインアップしますか?)
  2. ActivitySplashScreenSignUp (この情報を入力してください)
  3. ActivityGameMain (ゲームのメイン画面)

そのため、ユーザーが各画面のボタンをクリックすると、アクティビティは正確にその順序で互いに起動します。

ユーザーがアクティビティ #2 から #3 に移動するとき、履歴スタックから #1 と #2 を完全に消去することは可能ですか? ユーザーが 3 番の状態で [戻る] ボタンを押した場合に、スプラッシュ画面に戻るのではなく、ホーム画面に戻るようにしたいと思います。

タスクでこれを達成できると思います(つまり、#3で新しいタスクを開始します)が、より簡単な方法があるかどうかを確認したかったのですが、

ありがとう

4

15 に答える 15

659

これは、ファイル内の関連するエントリでandroid:noHistory 属性をに設定することで実現できます。例えば:"true"<activity>AndroidManifest.xml

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />
于 2010-12-07T12:32:33.740 に答える
139

転送を使用して、次のアクティビティを起動している間にアクティビティ スタックから前のアクティビティを削除できます。 APIDemos にこの例がありますが、基本的には を呼び出しfinish()た直後に呼び出すだけstartActivity()です。

于 2009-12-14T04:20:44.263 に答える
54

はい、Intent.FLAG_ACTIVITY_NO_HISTORYをご覧ください。

于 2009-12-14T10:30:58.223 に答える
24

これはおそらく理想的な方法ではありません。誰かがより良い方法を持っているなら、私はそれを実装するのを楽しみにしています. バージョン 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) スレッドに従いません。

于 2011-05-13T03:04:12.220 に答える
23

API 11 より前で機能する 1 つの方法は、ActivityGameMain最初に開始してonCreateから、そのアクティビティの中でアクティビティを開始するActivitySplashScreenことです。スプラッシュに対して startActivity を呼び出すのActivityGameMainが早すぎるため、 は表示されません。

次に、インテントでこれらのフラグを設定することにより、開始時にスタックをクリアできます。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);
于 2012-03-08T18:48:33.983 に答える
20

私はこのように使います。

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
于 2015-09-15T01:32:20.953 に答える
8

私はこれに遅れていることを知っています(質問が出されてから2年が経ちました)が、戻るボタンの押下を傍受することでこれを達成しました。特定のアクティビティを確認するのではなく、カウントを確認するだけで、カウントが 3 未満の場合は、アプリを一時停止して、ユーザーを起動前に実行していたものに戻します。導入画面が 1 つしかないため、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();
    }
}
于 2012-03-03T17:33:03.023 に答える
1

このように startActivity(intent) の前に this.finish() を呼び出すだけです-

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
        this.finish();
        startActivity(intent);
于 2017-09-28T09:23:34.267 に答える
-7

これを試して:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

API レベル 1です。リンクを確認してください。

于 2013-03-22T11:43:22.637 に答える