11

クリックするとアクティビティを開始する必要があるというフォアグラウンドサービス通知があります。このアクティビティは、finish()を呼び出す前は非常に短命です。

通知を最初にクリックすると機能し、2回目以降はエラーが発生します。

    Sending contentIntent failed: android.app.PendingIntent$CanceledException

フォアグラウンドサービス通知を作成するときのコードで、randomActivity.classをfinishを呼び出さない別のActivityクラスに変更しました。これは、クリックするたびに完全に機能します。から:

    Intent notificationIntent = new Intent(this, RandomActivity.class);

に:

    Intent notificationIntent = new Intent(this, HomeActivity.class);

正常に動作します...

Android Developers Webサイトの標準の通知コードを使用し、NotificationBuilderを使用してテストしました。関係なく同じ結果が得られます。Activityがfinish()を呼び出さない限り、完全に機能します。

これは予想される動作ですか、バグですか、それとも何かが足りませんか?

私はあなたの助けとうまくいけば解決策を前もって感謝します!

注:私が使用している通知コードは完全に標準であるため、投稿していません。RandomActivityはfinish();を呼び出します。onCreateにあるので、そこにも珍しいことはありません。

4

4 に答える 4

12

できる限りのことを試した後、最終的に解決策を見つけました。誰かがこの問題に遭遇した場合に備えて投稿することもできます。

intrequestCodeを通知IDに一致させる必要がありました。なんで?まったくわかりません...インテントデータがnullになったり、再利用されたりするのを防ぐことができると思いますか?

    private static int ONGOING_NOTIFICATION_ID = 76;

    PendingIntent contentIntent = PendingIntent.getActivity(this,
    ONGOING_NOTIFICATION_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

startForegroundの通知IDと同じです。

    this.startForeground(ONGOING_NOTIFICATION_ID, not);

これが誰かを助けることを願っています。

于 2012-09-21T10:20:01.817 に答える
7

(あなたが提案したように)通知IDを確認する必要はありませんでしたが、フラグをFLAG_UPDATE_CURRENTではなく、に変更する必要がありましたFLAG_ONE_SHOT

を使用FLAG_ONE_SHOTすると、保留中のインテントは配信されるとキャンセルされ、その後、通知をタップしても、同じ保留中のインテントを再度配信することはできません。したがって、例外です。

これが私にとっての問題でした。

于 2015-01-23T04:15:54.920 に答える
1

同様の問題が発生しました。フォアグラウンド通知ではありませんでしたが、通知をクリックするとSending contentIntent failed: android.app.PendingIntent$CanceledExceptionエラーが発生し、何も起こりませんでした。ここで探していたので、問題と解決策について説明したいと思います。

私にとっての問題は、サーバー上にインストールオブジェクトが1つ残っていることでした。そのため、実際にはFCM onMessageReceivedイベントを2回取得し、ローカル通知を2回公開していました。同じイベントに関連していたので、自分自身を置き換えるために実装されたので、気づきませんでした。

しかし、私は現在の時刻を使用して、10ミリ秒の精度で一意のrequestCodeを生成していたため、2番目の呼び出しが最初の呼び出しから10ミリ秒後にローカル通知を公開した場合、同じ要求コードを取得しました。

フラグFLAG_CANCEL_CURRENTも使用していましたが、以前の保留中のインテントをキャンセルして、新しいインテントを作成する必要があります。

そこで、requestCodeを定数にしようとしましたが、それでも、インテントが正常に機能している場合がありました。

原因は、2つの呼び出しが並行して実行されていたことであり、pendingIntentがキャンセルされた通知が実際に後で公開され、pendingIntentが機能していた通知が置き換えられたことが原因だと思います。

私の解決策:onMessageReceivedのコードが、前の呼び出しが完了するまで待機するようにしました。それは起こらなくなり、すべてが正常に機能します。また、onMessageReceivedメソッド内にフィルタリングを追加して、まったく同じデータを持ち、5秒未満の間隔で受信される着信プッシュを無視します。

于 2018-09-29T16:43:38.867 に答える
0

PendingIntent私の問題は、複数のが等しいことに起因していました。この場合、1つPendingIntentをキャンセルすると、すべての「重複」がキャンセルされます。

Androidのドキュメントによると

保留中のインテントを取得するために、2つのインテントが同じであると見なされる場合を知ることが重要です。よくある間違いは、「余分な」コンテンツのみが異なるIntentsを使用して複数のPendingIntentオブジェクトを作成し、毎回異なるPendingIntentを取得することを期待することです。これは起こりません。マッチングに使用されるインテントの部分は、Intent#filterEquals(Intent)で定義されたものと同じです。Intent#filterEquals(Intent)に従って同等の2つのIntentオブジェクトを使用する場合、両方に対して同じPendingIntentを取得します。

この問題に対処する方法に関する2つの提案:

複数の異なるPendingIntentオブジェクトを同時にアクティブにする必要がある場合(両方が同時に表示される2つの通知として使用する場合など)、それらを異なるものに関連付けるために、それらについて異なるものがあることを確認する必要があります。保留中のインテント。これは、Intent#filterEquals(Intent)によって考慮されるIntent属性のいずれか、またはgetActivity(Context、int、Intent、int)、getActivities(Context、int、Intent []、int)、getBroadcast( Context、int、Intent、int)、またはgetService(Context、int、Intent、int)。

使用するインテントのいずれかに対して一度に1つのPendingIntentのみをアクティブにする必要がある場合は、代わりにフラグFLAG_CANCEL_CURRENTまたはFLAG_UPDATE_CURRENTを使用して、指定しているインテントに関連付けられている現在のPendingIntentをキャンセルまたは変更できます。

次の場合、2つのインテントは等しくなります。

それらのアクション、データ、タイプ、ID、クラス、およびカテゴリーは同じです。これは、インテントに含まれる追加のデータを比較しません。技術的には、IntentFilterと実際に照合する場合、識別子は無視されますが、ここでは他のフィールドと同様に等しいかどうかが直接比較されることに注意してください。

于 2019-12-10T22:26:04.747 に答える