94
  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

    Notification notification = new Notification(R.drawable.icon, "Upload Started", System.currentTimeMillis());
    notification.setLatestEventInfo(context, "Upload", response, pendingIntent);

    nManager.notify((int)System.currentTimeMillis(), notification);
}

この関数は複数回呼び出されます。notificationクリックすると、それぞれが testActivity を起動したいと思います。残念ながら、最初の通知のみが testActivity を起動します。残りをクリックすると、通知ウィンドウが最小化されます。

追加情報: 関数displayNotification()は というクラスにありUploadManagerます。 インスタンス化するからContext渡されます。関数は、同じように UploadManager で実行されている関数から複数回呼び出されます。UploadManageractivitydisplayNotification()AsyncTask

Intent intent編集 1: String 応答をとして渡していることを忘れていましたextra

  protected void displayNotification(String response) {
    Intent intent = new Intent(context, testActivity.class);
    intent.putExtra("response", response);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

通知が作成されたときの文字列応答を反映するために追加の「応答」が必要なため、これは大きな違いになります。代わりに を使用するPendingIntent.FLAG_UPDATE_CURRENTと、追加の「応答」は、 への最後の呼び出しでの String 応答が反映されdisplayNotification()ます。

のドキュメントを読むことで、これがなぜなのかがわかりますFLAG_UPDATE_CURRENT。ただし、現時点ではこれを回避する方法がわかりません。

4

14 に答える 14

135

PresidentingIntent.getActivityには使用せず、代わりにIntent.FLAG_ACTIVITY_NEW_TASKFLAG_ONE_SHOTを使用してください


コメントからコピー:

次に、インテントにダミーアクションを設定します。そうしないと、余分なものが削除されます。例えば

intent.setAction(Long.toString(System.currentTimeMillis()))
于 2010-07-02T19:40:12.110 に答える
64

ウィジェットごとにRemoteViewsいくつかの異なると苦労しました。これらを追加すると機能しました:IntentsButtonHomeScreen

1. intent.setAction(Long.toString(System.currentTimeMillis()));

2. PendingIntent.FLAG_UPDATE_CURRENT

        PackageManager pm = context.getPackageManager();

        Intent intent = new Intent(context, MyOwnActivity.class);
        intent.putExtra("foo_bar_extra_key", "foo_bar_extra_value");
        intent.setAction(Long.toString(System.currentTimeMillis()));
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.widget_layout);
        views.setOnClickPendingIntent(my_button_r_id_received_in_parameter, pendingIntent);
于 2012-02-02T23:25:55.297 に答える
49

アクションを設定すると、これが解決されました。状況についての私の理解は次のとおりです。


それぞれに PendingIntent が添付された複数のウィジェットがあります。いずれかが更新されるたびに、すべてが更新されました。フラグは、まったく同じ PendingIntents で何が起こるかを説明するためにあります。

FLAG_UPDATE_CURRENT の説明が読みやすくなりました:

作成中の同じ PendingIntent が既に存在する場合は、古いものをすべて作成中の新しい PendingIntent に更新します。

エクストラを除く PendingIntent 全体をまったく同じように定義します。したがって、各インテントに異なるエクストラがあっても (私にとっては appWidgetId を追加していました)、Android では同じです。

ダミーの一意の文字列を使用して .setAction を追加すると、OS に通知されます。これらは完全に異なり、何も更新しません。最後に、各ウィジェットに独自の構成インテントが添付されている、希望どおりに機能する実装を次に示します。

Intent configureIntent = new Intent(context, ActivityPreferences.class);

configureIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

configureIntent.setAction("dummy_unique_action_identifyer" + appWidgetId);

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, configureIntent,
    PendingIntent.FLAG_UPDATE_CURRENT);

アップデート


ブロードキャストを使用している場合は、さらに優れたソリューションです。一意の PendingIntent も、一意の要求コードによって定義されます。これが私の解決策です:

//Weee, magic number, just want it to be positive nextInt(int r) means between 0 and r
int dummyuniqueInt = new Random().nextInt(543254); 
PendingIntent pendingClearScreenIntent = PendingIntent.getBroadcast(context, 
    dummyuniqueInt, clearScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2014-07-05T01:18:11.563 に答える
13

私は同じ問題を抱えていましたが、フラグを次のように変更することで修正できました。

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
于 2010-07-02T19:44:57.237 に答える
8

Fwiw、私は よりも の方が幸運PendingIntent.FLAG_CANCEL_CURRENTでしたPendingIntent.FLAG_UPDATE_CURRENT

于 2011-08-09T23:35:25.963 に答える
5

私は同じ問題を抱えていて、以下の手順で修正しました

1) インテントのフラグをクリアする

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

2)以下のコードでintent.setActionを挿入します

 intent.setAction(Long.toString(System.currentTimeMillis()));

3) Pendingintent の場合、以下のコードを挿入します

   PendingIntent Pintent = PendingIntent.getActivity(ctx,0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

私はあなたと一緒に働くことを願っています

于 2015-10-17T23:05:25.897 に答える
0
// Use pending Intent and  also use unique id for display notification....
// Get a PendingIntent containing the entire back stack
PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager mNotificationManager = (NotificationManager)  sqlitewraper.context.getSystemService(Context.NOTIFICATION_SERVICE);
// Issue the notification
mNotificationManager.notify(id, builder.build());
于 2014-07-26T06:24:59.623 に答える
0

to send data extra correctly you should send with pending intent the notification id like this: PendingIntent pendingIntent = PendingIntent.getActivity(context, (int)System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);

于 2015-11-13T06:56:51.240 に答える
0

私は同じ問題を抱えており、PendingIntent.html.FLAG_UPDATE_CURRENTを使用して修正します。

ソースコードを確認しました。ActivityManagerService.javaでは、主要なメソッドは次のとおりです。フラグが PendingIntent.FLAG_UPDATE_CURRENT で、updateCurrent が true の場合。一部のエクストラは新しいものに置き換えられ、置き換えられた PendingIntent が取得されます。

    IIntentSender getIntentSenderLocked(int type, String packageName,
            int callingUid, int userId, IBinder token, String resultWho,
            int requestCode, Intent[] intents, String[] resolvedTypes, int flags,
            Bundle bOptions) {

// ... omitted

        final boolean noCreate = (flags&PendingIntent.FLAG_NO_CREATE) != 0;
        final boolean cancelCurrent = (flags&PendingIntent.FLAG_CANCEL_CURRENT) != 0;
        final boolean updateCurrent = (flags&PendingIntent.FLAG_UPDATE_CURRENT) != 0;
        flags &= ~(PendingIntent.FLAG_NO_CREATE|PendingIntent.FLAG_CANCEL_CURRENT
                |PendingIntent.FLAG_UPDATE_CURRENT);

        PendingIntentRecord.Key key = new PendingIntentRecord.Key(
                type, packageName, activity, resultWho,
                requestCode, intents, resolvedTypes, flags, bOptions, userId);
        WeakReference<PendingIntentRecord> ref;
        ref = mIntentSenderRecords.get(key);
        PendingIntentRecord rec = ref != null ? ref.get() : null;
        if (rec != null) {
            if (!cancelCurrent) {
                if (updateCurrent) {
                    if (rec.key.requestIntent != null) {
                        rec.key.requestIntent.replaceExtras(intents != null ?
                                intents[intents.length - 1] : null);
                    }
                    if (intents != null) {
                        intents[intents.length-1] = rec.key.requestIntent;
                        rec.key.allIntents = intents;
                        rec.key.allResolvedTypes = resolvedTypes;
                    } else {
                        rec.key.allIntents = null;
                        rec.key.allResolvedTypes = null;
                    }
                }
                return rec;
            }
            rec.canceled = true;
            mIntentSenderRecords.remove(key);
        }

于 2017-06-22T02:32:28.950 に答える
-5

同じ問題が発生し、フラグを次のように変更することで修正できました。

LayoutInflater factory = LayoutInflater.from(this);            
      final View textEntryView = factory.inflate(R.layout.appointment, null);
      AlertDialog.Builder bulider= new AlertDialog.Builder(PatientDetail.this);
      final AlertDialog alert=bulider.create();


        bulider.setTitle("Enter Date/Time");
        bulider.setView(textEntryView);
        bulider.setPositiveButton("Save", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                      EditText typeText=(EditText) textEntryView.findViewById(R.id.Editdate);
                      EditText input1 =(EditText) textEntryView.findViewById(R.id.Edittime);
                      getDateAndTime(typeText.getText().toString(),input1.getText().toString());
                }
            });
        bulider.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

        bulider.show();

    }
于 2012-12-21T12:54:34.163 に答える