138

私のアプリには通知があり、明らかにフラグがなくても毎回新しいアクティビティが開始されるため、複数の同じアクティビティが互いに重なって実行されますが、これは間違っています。

私がやりたいことは、通知の保留中のインテントで指定されたアクティビティを、既に実行されている場合は前面に出し、そうでない場合は開始することです。

これまでのところ、私が持っているその通知の意図/保留中の意図は

private static PendingIntent prepareIntent(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

そして奇妙なことに、うまくいくこともあれば、うまくいかないこともあります...フラグのすべての組み合わせをすでに試したような気がします。

4

8 に答える 8

47

それを行う最善の方法と簡単な方法は、通常どおりアクティビティを開始することですが、そのアクティビティをマニフェストでsingleInstanceプロパティに設定します。これにより、アクティビティを常に前面に表示し、アクティビティが存在しない場合は OS に新しいアクティビティを自動的に作成させるか、現在存在するアクティビティを前面に表示させることで、現在抱えている両方の問題に実際にアプローチします (singleInstance財産)。

これは、アクティビティが単一のインスタンスとして宣言される方法です。

<activity 
   android:name=".YourActivity"
   android:launchMode="singleInstance"/>

また、singleInstance を介して起動する際の途切れ途切れのアニメーションを回避するために、代わりに「singleTask」を使用できます。どちらも非常に似ていますが、違いは Google のドキュメントに従ってここで説明されています。

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

singleInstance は、システムがインスタンスを保持しているタスクに他のアクティビティを起動しないことを除いて、「singleTask」と同じです。アクティビティは、常にそのタスクの唯一のメンバーです。

お役に立てれば。

よろしく!

于 2013-09-26T21:45:57.763 に答える
18

これは古いスレッドですが、まだ答えを探しているすべての人のために、ここに私の解決策があります. マニフェスト設定なしで、純粋にコード内にあります。

private static PendingIntent prepareIntent(Context context) {
  Intent intent = new Intent(context, MainActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);      
  return PendingIntent.getActivity(context, NON_ZERO_REQUEST_CODE, intent, 
    PendingIntent.FLAG_UPDATE_CURRENT);
}

ここで FLAG_ACTIVITY_SINGLE_TOP は、タスク スタックの最上位にある場合、既存のアクティビティを開きます。最上位ではなく、スタック内にある場合、FLAG_ACTIVITY_CLEAR_TOP は、ターゲット アクティビティの上にあるすべてのアクティビティを削除して表示します。アクティビティがタスク スタックにない場合は、新しいアクティビティが作成されます。言及する非常に重要なポイント - PendingIntent.getActivity() の 2 番目のパラメーター、つまり、requestCode はゼロ以外の値を持つ必要があります (私のスニペットでは NON_ZERO_REQUEST_CODE と呼んでいました)。そうしないと、これらのインテント フラグは機能しません。どうしてそのままなのかわからない。フラグ FLAG_ACTIVITY_SINGLE_TOP は、マニフェストのアクティビティ タグで android:launchMode="singleTop" と交換可能です。

于 2019-01-10T14:55:22.867 に答える
3

私はこれを試しましたが、IDE がコードについて不平を言っていましたが、うまくいきました

Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT)
            .setSmallIcon(R.drawable.cast_ic_notification_0)
            .setContentTitle("Title")
            .setContentText("Content")
            .setContentIntent(intent)
            .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5;
            .setAutoCancel(true)
            /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/;
    NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());
于 2016-11-10T12:43:17.227 に答える
2

アクティビティがまだ開始されていない場合は開始したいと言っているので、再開してもかまわないかもしれません。インテントについても、大量の提案とフラグの組み合わせをテストしました。これにより、必要なアクティビティが常に前面に表示されますが、以前に関連付けられていた状態は保持されません。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);

API11+ のみ。

于 2015-11-29T21:39:42.613 に答える
1

Androidトレーニングサイトにある通知を追加した後、同様の問題が発生しました。ここでの他の回答はどれもうまくいきませんでしたが、この回答はうまくいきました。概要:

final Intent notificationIntent = new Intent(context, YourActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
于 2019-04-23T22:27:42.273 に答える