40

TaskStackBuilderを通知とともに使用して、戻るボタンが通過するバックスタックを作成しようとしています。私のアプリの通常の流れ:

  1. アクティビティAはランチャーから起動されます。
  2. ユーザーはAからアイテムを選択します。これにより、何をロードするかを追加してBが起動します。
  3. ユーザーがBからアイテムを選択すると、ロードするものに追加のCが起動します。

ユーザーがアプリを使用していないときにバックグラウンドで更新した後、通知を生成することがあります。この通知をクリックすると、AとBをスキップしてアクティビティCが起動します。設計ガイドラインに従ってバックスタックを作成しようとしているため、押し戻すとホーム画面ではなくアクティビティBに移動します。私の問題は、アクティビティBが、データベースから何を取得するかを指示するために、起動インテントに追加が必要なことです。

私の現在のTaskStackBuilderコード:

TaskStackBuilder sBuilder = TaskStackBuilder.create( this );
sBuilder.addParentStack( ActivityC.class );
sBuilder.addNextIntent( launchIntent );

pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );

通知をクリックすると、アクティビティCが正常に起動しますが、IllegalArgumentExceptionアクティビティBが要求するIDを認識していないため、押し戻すとContentProviderからので爆発します。この余分なものをバックスタックに入れる方法はありますか、それとも私は立ち往生していますか?

4

3 に答える 3

58

この行:

sBuilder.addParentStack( ActivityC.class );

で宣言されたすべての親を追加ActivityCAndroidManifest.xmlます<meta-data>。私はそれが何であるかわかりません、私はそれを使用していません。私はあなたがそれを必要とするとは思わない。

この行は、配列に意図を追加します。

sBuilder.addNextIntent(launchIntent);

次に、インテントの配列を使用して、おそらくPendingIntent.getActivitiesを使用してPendingIntentを作成します実装が見つかりませんでした。実装は、Context.startActivitiesで開始されます。

インテントのセットを作成するだけでよいと思います。そこで、追加機能を追加できます。

Intent activityA = new Intent(context, ActivityA.class);
activityA.putExtra(key, valueA);
Intent activityB = new Intent(context, ActivityB.class);
activityB.putExtra(key, valueB);
Intent activityC = new Intent(context, ActivityC.class);
activityC.putExtra(key, valueC);

そしてそれらをビルダーに追加します:

sBuilder.addNextIntent(activityA);
sBuilder.addNextIntent(activityB);
sBuilder.addNextIntent(activityC);
pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );

私はそれをテストしていません、これは私の速い研究の結果です、私が間違っているなら誰かが私を訂正してくれることを願っています。

于 2012-11-08T17:25:01.107 に答える
14

この問題に取り組む別の方法を見つけました:メソッドTaskStackBuilder.editIntentAt(int)を使用します

元。

Intent intentC = new Intent(context, ActivityC.class);
intentC.putExtra(key, valueC);

TaskStackBuilder sBuilder = TaskStackBuilder.create(this)
    .addParentStack(ActivityB.class)
    .addParentStack(ActivityC.class)
    .addNextIntent(intentC);

Intent intentA = sBuilder.editIntentAt(0);
intentA.putExtra(key, value);
Intent intentB = sBuilder.editIntentAt(1);
intentB.putExtra(key, value);
于 2014-06-26T18:02:48.753 に答える
9

私はこれに苦労しました。私の調査の結果、次の解決策が得られました(@pawelziebaと非常に似ていますが、重要な削除が1つあります)。

Intent activityA = new Intent(context, ActivityA.class);
activityA.putExtra(key, valueA);
Intent activityB = new Intent(context, ActivityB.class);
activityB.putExtra(key, valueB);
Intent activityC = new Intent(context, ActivityC.class);
activityC.putExtra(key, valueC);

TaskStackBuilder sBuilder = TaskStackBuilder.create(this)
    .addNextIntent(activityA);
    .addNextIntent(activityB);
    .addNextIntent(activityC);
PendingIntent pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT );

マニフェストを親の関連付けで変更してはならず、次のものを使用したくないことに注意してください。

sBuilder.addParentStack( ActivityC.class );

そうしないと、新しく作成されたタスクで、余分なものがないインテントを持つActivityAとActivityBが繰り返されます。エクストラを使用してインテントを渡す必要がない場合は、マニフェストに親の関連付けを追加して、addParentStack()を呼び出すことができます。

于 2014-04-24T22:22:09.173 に答える