2

ドキュメントが言ったことを正確に実行するため、このすべてのフラグがどのように機能するかを本当に理解していませんが、問題は解決しませんでした。私のアクティビティは次のように起動しています: (最初) アクティビティ A -> アクティビティ B -> (2番目) アクティビティ A. ボタンを押すと、アクティビティ B -> アクティビティ A -> アプリケーションの終了に戻ります。ここで、アクティビティ B から指定された 2 番目のアクティビティ A が必要です。戻ると、アクティビティ B と最初のアクティビティ A がスキップされ、すぐにアプリケーションが終了します。コードは次のとおりです。

A から B へ:

TabActivityGroupAbs parentActivity = (TabActivityGroupAbs) ((Activity) ctx).getParent();
detailIntent = new Intent(parentActivity, B.class);
parentActivity.startChildActivity("BFromA", detailIntent);

BからAへ:

TabActivityGroupAbs parentActivity = (TabActivityGroupAbs) ((Activity) ctx).getParent();
detailIntent = new Intent(parentActivity, A.class);
detailIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
detailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
parentActivity.startChildActivity("AFromB", detailIntent);

B から A に flags を追加しFLAG_ACTIVITY_CLEAR_TOPます。しかし、それは何もクリアしませんでした。押し戻しても、アクティビティ B に移動し、次に再び A に移動しました。私は何を間違えましたか?

そして、どのフラグもまったく機能していないようです。A から B に、次のように記述します。

detailIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

Bがアクティビティスタックに置かれるのを防ぐはずです。しかし、そうではありません。2 番目のアクティビティ A から、押し戻すと B に戻ります。

アプリケーションを終了し、2 番目のアクティビティ A から B に戻らないようにするにはどうすればよいでしょうか。

編集:言及するのを忘れていました。B から A へ、finish() を呼び出してアクティビティ B を終了した場合、2 番目のアクティビティ A から戻ると、最初のアクティビティ A に戻ります。本当に奇妙です。

4

3 に答える 3

19

一度読んでおけば、flag_activity_clear_top の使い方に問題はありません。

以下は、Flag_Activity_Clear_Top の使用法に関する簡単な説明です。

正しい使用のためのワンライナーフォーミュラ:

呼び出し元のアクティビティと呼び出されたアクティビティの間の中間のアクティビティ (存在する場合) は常にクリアされます。

アクティビティ フローは次のとおりです。

アクティビティ A -> アクティビティ B -> アクティビティ C (D に移動するには、アクティビティ クリア トップを使用します) -> アクティビティ D

上記のシーケンスで、D に到達するときに戻ると、Activity C->Activity B-> Activity A が取得されます。これは、Activity C と Activity D の間に INTERMEDIATE ACTIVITY がないためです。

ここにいる一部の開発者の神話は -

C からフラグ アクティビティ クリア トップを使用してアクティビティ D に到達した後、D から戻るキーを押すと、アプリケーションの外部に移動することを期待していましたが、これは決して起こりません

Flag_Activity_Clear_Top は、常に 2 つのアクティビティ間の中間アクティビティを常にクリアします。

于 2013-07-01T04:29:38.600 に答える
6
From B to A, I add the flags FLAG_ACTIVITY_CLEAR_TOP. But it didn't clear anything. When I pressed back, it still went to Activity B, and then A again. What did I do wrong?

FLAG_ACTIVITY_CLEAR_TOP前のアクティビティではなく中間のアクティビティをクリアします。スタックからアクティビティ B を削除するには、アクティビティ A を呼び出すときに B で finish() を呼び出す必要があります

于 2012-07-18T04:11:42.960 に答える
0

次のメソッドを使用して、子アクティビティを開始および終了できます

public ArrayList<String> mIdList;
/**
 * Starts an Activity as a child Activity to this.
 * 
 * @param Id
 *            Unique identifier of the activity to be started.
 * @param intent
 *            The Intent describing the activity to be started.
 * @throws android.content.ActivityNotFoundException.
 */
public void startChildActivity(String Id, Intent intent) {
    Window window = getLocalActivityManager().startActivity(Id,
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    if (window != null) {
        mIdList.add(Id);
        setContentView(window.getDecorView());
    }
}

/**
 * This is called when a child activity of this one calls its finish method.
 * This implementation calls {@link LocalActivityManager#destroyActivity} on
 * the child activity and starts the previous activity. If the last child
 * activity just called finish(),this activity (the parent), calls finish to
 * finish the entire group.
 */
@Override
public void finishFromChild(Activity child) {
    LocalActivityManager manager = getLocalActivityManager();
    int index = mIdList.size() - 1;

    if (index < 1) {
        finish();
        return;
    }

    manager.destroyActivity(mIdList.get(index), true);
    mIdList.remove(index);
    index--;
    String lastId = mIdList.get(index);
    Intent lastIntent = manager.getActivity(lastId).getIntent();
    Window newWindow = manager.startActivity(lastId, lastIntent);
    setContentView(newWindow.getDecorView());
}

例:

startChildActivity("Merchants", new Intent(this,MerchantScreen.class));
于 2012-07-18T04:10:14.443 に答える