1

クリックすると「記事」アクティビティを開始する「リスト」アクティビティがあります。「記事」アクティビティを直接開くプッシュ通知もあります。

ユーザーが記事リストに戻るように、通知から来たときに「記事」アクティビティの「戻る」ボタンの動作を「リスト」アクティビティを開始するように変更しました。

問題は、アプリがすでにバックグラウンドで開かれていて、通知を開くと、アプリが前面に戻るだけです。私が達成したいのは、通知をクリックして「リスト」アクティビティに戻るときに適切な記事を開くことです。リストアクティビティが2回開かれる可能性はありません。

'article'タスクを分離し、通知インテントで新しいタスクを作成しようとしましたが、複数の通知を開いてクリックすると、別の'list'アクティビティが開きます。

目標を達成するためにアクティビティのタスクとインテントフラグを定義する正しい方法は何ですか?

編集:マニフェスト部分:

<activity android:name="ListFeed" android:configChanges="orientation|screenLayout" android:launchMode="singleInstance" android:screenOrientation="unspecified"
        android:taskAffinity="com.app.MyTask"></activity>
        <activity  android:name="Article" android:launchMode="standard" android:configChanges="orientation|screenLayout" android:screenOrientation="unspecified"
            android:taskAffinity="com.app.MyTask"></activity>

通知の意図:

Intent notificationIntent = new Intent(context, Article.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, notificationID, notificationIntent, PendingIntent.FLAG_ONE_SHOT);

ありがとう!!

4

2 に答える 2

0

あなたの質問から私が得たのは、1) listActivity A があるということです

2) ArticalActivity B.

i) まず、B から戻るたびにアクティビティ A を開きたいと思いますか? そのためにはdispatchKeyEvent、[戻る] ボタン イベントをリッスンしてアクティビティ A を開始するか、以下のコードを使用します。

@Override
public void onBackPressed() {
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

ii) アクティビティ A (リスト) のインスタンスを 1 つだけ開きたい。launchModeこのため、基本的にアクティビティ A のマニフェスト宣言で として使用できます singleInstance

android:launchMode="singleTask"

起動モードのドキュメントを読むことができます

何か見逃した場合はお知らせください。

于 2012-07-08T17:44:34.287 に答える
0

launchModes と excludeFromRecents をいじっているようですが、これは良いことではありません。Android の標準的な動作は、あなたが望むほとんどのことを行うはずです。

これを確認するために、MainActivity、ListActivity、ArticleActivity を含む単純な 3 つのアクティビティ アプリケーションを作成しました。非標準の起動モードは使用しておらず、Intent フラグも設定していません (onBackPressed()以下を除く)。Main Activity は、通知を作成して投稿し、特定の記事を表示します。MainActivity は ListActivity を開始します。ListActivity の各要素は、ArticleActivity のインテントを開始し、EXTRAS でいくつかの情報を渡します。これにより、ArticleActivity は表示する記事を認識できます。

あなたが説明した動作(つまり、アプリが実行されていなくても、通知からアプリを起動した後に ArticleActivity から ListActivity に戻る)を実現するために、Ankit が提案したことを実行しました(つまりonBackPressed()、ArticleActivity でオーバーライドします) 。このような:

@Override
public void onBackPressed() {
    // Return to ListActivity
    Intent intent = new Intent(this, ListActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    // Finish this activity (in case the ListActivity wasn't already in the stack)
    finish();
}

FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOPこれを使用したのは、ListActivity がアクティビティ スタックに既に存在する場合 (つまり、同じインスタンスに戻る場合)、ListActivity を再作成しないためです。

finish()アプリがバックグラウンドで実行されておらず、ユーザーが通知から開始した場合、ListActivity が作成され、ArticleActivityの上に配置されるため、呼び出しを追加する必要がありました。次に、ユーザーが「戻る」を押して ListActivity を終了すると、ArticleActivity がその下に表示されます。ここに追加finish()すると、ArticleActivity が消えて、ListActivity から「戻る」を押すと元の場所に戻るようになります。

コードの送信をご希望の場合は、お知らせください。

于 2012-07-09T11:45:21.193 に答える