3

通知用の TaskStackBuilder と個別の PendingIntents の組み合わせに問題があります。それが何であるかを説明しましょう。

何かが発生したときに通知を作成する IntentService があります。場合によっては、いくつかの独立した通知を作成します。Google が言ったように通知をマージしないのはなぜですか? 各通知は同じアクティビティを開く必要があるため、渡されたインテントに異なるエクストラが含まれています。だからここで何をすべきか:

エクストラを使用して新しいインテントを作成します。

Intent notificationIntent = new Intent(this, ItemActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

notificationIntent.putExtra(ItemActivity.URL_KEY, feed.getUrl());
notificationIntent.putExtra(ItemActivity.FEED_ID, feed.get_id());
notificationIntent.putExtra(ItemActivity.TITLE, feed.getTitle());

ここがトリッキーな部分です。適切なバック スタックで ItemActivity を開きたいのです。これは、AppBar で [戻る] ボタンまたは [上へ] を押したときに、親アクティビティに戻りたいということです。だからここに私がしていることがあります(Googleドキュメントによると:http://developer.android.com/training/notify-user/navigation.html):

AndroidManifest.xml には次のものがあります。

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ItemActivity"
        android:label="@string/item_activity"
        android:launchMode="singleTask"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>

次に、バックスタックを作成します:

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ItemActivity.class);
stackBuilder.addNextIntent(notificationIntent);

そして PendingIntent:

PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

最後に - 通知:

NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
        (...)
        .setContentIntent(notificationPendingIntent)
        (...)
mNotifyManager.notify(feed.get_id(), builder.build());

このシナリオでは、アプリは適切なバック スタックを使用して別の通知を作成しますが、同じ PendingIntent を使用します。

たとえば、PendingIntent を取得中に requestCode を feed.get_id() (または System.currentTimeMillis() のような PendingIntent ごとに別の異なる番号) に置き換えると、通知をタップすると、適切なインテント (通知ごとに異なる PendingIntent) を持つアクティビティが表示されますが、バック スタックなし - [戻る] ボタンと [上へ] ボタンでアプリケーションを閉じます。

マニフェストから android:launchMode="singleTask" を削除しようとしました。新しいインテントを作成するときにフラグを追加しないでください。インターネットの半分、何百もの StackOverflow の投稿を読み、何も読みません。

私はこの 2 つのシナリオの作業の組み合わせを管理していません。つまり、適切なインテントとバック スタックでアクティビティを開きます。

事前に、「onBackPressed をオーバーライドしてそこからアクティビティを開始する」などと書かないでください。ここで何が間違っているのか、適切なツールでこれを達成する方法を知りたいのです。

4

1 に答える 1