web-dev-qa-db-ja.com

Androidアプリがマルチタスクトレイから停止されたときにFirebase Notificationを受信しない

私は 類似の質問 を読んでいますが、正しい答えを得ることができませんでした。

約500台のデバイスに通知を送信するシステムがあります。

残念ながら、これらのデバイスの多くは通知を受信して​​いません。 OPPO F1シリーズの電話は特に通知を受けていないことがわかりました。

これは、アプリがマルチタスクトレイから停止した場合に発生することを確認しています。これを解決するにはどうすればよいですか?

更新:タスクトレイからアプリを閉じると、アプリがアプリマネージャーで強制的に停止されることがわかりました。タスクトレイからWhatsappを閉じても、強制停止されません。 Whatsappはそれをどのように処理していますか?

64
milan m

アップデート03/2017-回答の一部を含める こちら

スワイプクローズ/キル/強制停止に関するトピックについては、このトピックはかなり長い間議論されており、明確な答えはないようです。私のテスト中に、私はまだメッセージを受け取るdata-onlyメッセージペイロードでテスト済み)if Iアプリを閉じるスワイプします。しかし、[設定]メニューから強制終了すると、メッセージを受信できませんでしたになります。これはnot常に動作することに注意してください。

アプリをスワイプスワイプすると強制停止と同じになるように設計されたデバイスがいくつかあります(参照私の答え ここ )。

また、アプリがまだスワイプされただけでも、デバイスが強制的に閉じられていなくても、デバイス自体がメッセージを受信できません。他の人は、WhatsAppのようなアプリがそれを行うことができたので、これは事実ではないと言う。私がこれまでに学んだ理由は、デバイスメーカーがホワイトリストに登録しているためです有名なアプリのほとんどが可能になっています。

(IMO)、これはデバイスにも依存するトピックであり、FCMにはトータルコントロールがないため、これはどこにも文書化されていません。


元の回答:

デバイス固有であるため(投稿で言及したように:OPPO F1シリーズの電話)、アプリがから停止された場合、そのデバイスのマルチタスクトレイ、実際にはkillingアプリであり、それに関連するサービスやその他のバックグラウンドプロセスも破棄されます。これをご覧ください answer 私が言いたいことについてもう少し考えてください。

コミュニティを検索する場合、ここで一般的に推奨されるのは、 START_STICKY フラグを使用することです。しかし、以前にFirebaseMessagingServiceについて言及されていたことがわかりました(これを参照してください post 、@ ArthurThompsonによるコメント):

これらのサービスは、デバイスで常に実行されているGoogle Playサービスによって開始されます。これらのサービスを自分で開始/停止する必要はありません。

そうは言っても、可能性があります(再びコメントから):

これを許可/禁止するデバイスの設定がある可能性があります。


サービスがデバイス自体によって強制終了されているかどうかをさらにテストするか、通知をブロックしている設定があるかどうかを確認することをお勧めします。

47
AL.

サービスクラスで stopWithTask 属性を使用しようとしましたか?

<service
    Android:name="com.yourapp.YourPushService"
    Android:stopWithTask="false" />

Trueに設定すると、ユーザーがアプリケーションが所有するアクティビティをルートとするタスクを削除すると、このサービスが自動的に停止します。デフォルトはfalseです。

フラグがfalseの場合、ServiceクラスにonTaskRemovedコールバックがあります。

この場合、「スワイプ」イベントを検出でき、回避策を実装できます。

18
danesz

私は同じことを経験しましたが、私の場合は、Oppo電話ではなくXiaomi電話でした。実際に起こるのは、システムトレイからアプリを閉じると、システムがアプリを完全に強制終了することです。つまり、アプリはGCM/FCM経由で通知を受信できません。 WAKE_LOCKパーミッションも役に立たない。

それは、電話が通知を受信して​​いないという意味ではありません。そうです。アプリに表示させないだけです。これを確認するには、adbからブロードキャストを送信し、logcatを調べます。

この問題の解決策の1つは、SyncAdapterを使用することです。推奨されていませんが、これを使用するアプリを見てきました。他の可能な解決策は、常に実行されているある種のバックグラウンドサービスを使用することです。殺されることはほとんどないので、AlarmManagerを使用する人もいます。私のポイントは-あなたはあなたの通知のためにGCM/FCMに頼ることはできません。

WhatsAppについて話しましょう-

Xiaomi電話では、特定の基準に基づいてアプリをホワイトリストまたはブラックリストに登録します。アプリをダウンロードし、そのアプリがホワイトリストに含まれている場合、アプリは通知を表示できます。そうでない場合、あなたはすでに何が起こるか知っています。しかし、良い点は、これらの設定を変更できることです。 Securityという名前のアプリを探します。適切な権限を取り消すと、WhatsAppでも通知の表示が停止します。

9
thetanuj

私も同じ問題に直面していましたが、多くのデバッグの後に、アクティビティの1つの停止メソッドでFirebase通知を受け取るサービスを停止していることに気付きました。

  1. アプリのどこかでこれらのサービスを停止しているかどうかを確認してください。
  2. インテントサービスではなく、サービスを使用していることを確認してください。
  3. アプリをスワイプしてもサービスが停止することはありません。そのため、最初の2点でアプリをデバッグしてみてください。
4
Mohammed Atif

答えが見つかりました こちら

通知コンソールからデータメッセージを送信する方法はありません。

しかし、デバイスに通知を送信する他の方法があり、それらはonMessageReceived内でキャッチされます!

ターミナル(MacまたはLinux)またはPostmanなどのサービスを使用して、このリンクで投稿リクエストを送信する必要があります。 https://fcm.googleapis.com/fcm/send

次のボディで:

{
    "to": "/topics/your_topic_here",
   "data": {
       "text":"text",
       "text1":"text1",
       ...
   }
}

また、2つのヘッダーを追加する必要があります。

  1. 認証-key = your_server_key_here
  2. コンテンツタイプ-application/json

サーバーキーを取得するには、firebaseコンソールで見つけることができます:プロジェクト->設定->プロジェクト設定->クラウドメッセージング->サーバーキー

enter image description here

enter image description here

2
Andriy Antonov