アプリケーションが完全に閉じられたときに、Googleクラウドメッセージから通知を受信できるかどうかを知っていますか?
開いているかバックグラウンドであるかは知っていますが、それらを受信するためにプログラムすることはできますか?
編集:
アプリを閉じても通知を受け取らずに続行します。
エラーがあり、それを監視していない場合に備えて、コードを添付しました。
マニフェスト
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.frab"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk
Android:minSdkVersion="14"
Android:targetSdkVersion="19" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<uses-permission Android:name="com.frab.permission.C2D_MESSAGE" />
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<permission
Android:name="com.frab.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />
<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name="com.frab.MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
Android:name=".GGMBroadcastReceiver"
Android:permission="com.google.Android.c2dm.permission.SEND" >
<intent-filter>
<action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
<action Android:name="com.google.Android.c2dm.intent.REGISTRATION" />
<category Android:name="com.something" />
</intent-filter>
</receiver>
<service Android:name=".GCMIntentService" />
</application>
</manifest>
放送受信機
package com.something;
import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.content.Context;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v4.app.NotificationCompat;
import Android.util.Log;
import com.activities.SignIn;
import com.google.Android.gcm.GCMBaseIntentService;
import com.objects.Globals;
public class GCMIntentService extends GCMBaseIntentService {
private static final String TAG = "GGM <-----> FRAB";
private Bundle extras;
public GCMIntentService() {
super(Globals.SENDER_ID);
}
@Override
public void onDestroy() {
Log.d(TAG, "terminando servicio");
}
@Override
protected void onRegistered(Context context, String registrationId) {
Log.i(TAG, "onRegistered: registrationId=" + registrationId);
}
@Override
protected void onUnregistered(Context context, String registrationId) {
Log.i(TAG, "onUnregistered: registrationId = " + registrationId);
}
@Override
protected void onMessage(Context context, Intent data) {
extras = data.getExtras();
String message = extras.getString("msg");
Log.d("******", message);
sendNotification(message);
}
@Override
protected void onError(Context arg0, String errorId) {
Log.e(TAG, "onError: errorId = " + errorId);
}
}
package com.something;
import Android.app.Activity;
import Android.content.ComponentName;
import Android.content.Context;
import Android.content.Intent;
import Android.support.v4.content.WakefulBroadcastReceiver;
public class GGMBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
アプリが開いているとき:[〜#〜] ok [〜#〜]
アプリがバックグラウンドにある場合:Ok
ユーザーがアプリを強制的に閉じた場合:通知が届かない
何が問題ですか?
どうもありがとうございました。
はい、「アプリケーションが完全に閉じられたときにGoogleクラウドメッセージから通知を受信する」ことが可能です。
実際、ブロードキャストレシーバは、GCMがメッセージを配信するために使用するメカニズムです。 BroadcastReceiver を実装し、AndroidManifest.xmlで宣言する必要があります。
次のコードスニペットを参照してください。
AndroidManifest.xml
_<receiver
Android:name=".GcmBroadcastReceiver"
Android:permission="com.google.Android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
<category Android:name="com.google.Android.gcm.demo.app" />
</intent-filter>
</receiver>
<service Android:name=".GcmIntentService" />
_
Javaコード
_public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(),
GcmIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
_
GCMがデバイスにメッセージを配信すると、BroadcastReceiver
がメッセージを受信し、onReceive()
関数を呼び出します。ここで、サービスを開始して目的のタスクを実際に実行できます。
上記のコード例では、BroadcastReceiver
と呼ばれる特殊なWakefulBroadcastReceiver
を使用します。これにより、サービスが動作している間、デバイスがスリープ状態にならないことが保証されます。
公式Androidの同じページを参照してください: https://developer.Android.com/google/gcm/client.html
ユーザーがアプリを完全に閉じた場合:通知が届かない
これは、Androidプラットフォームの機能です。ユーザーがアプリケーションを強制的に停止すると、アプリケーションは停止状態になり、マニフェストで宣言されたブロードキャストレシーバーを含むコードは実行されません。ユーザーが明示的にアプリを起動すると、レシーバーが起動する状態になります。
さらに読むには: http://www.doubleencore.com/2014/06/effects-Android-application-termination/
タスクマネージャーからアプリを強制終了することはできませんが、最近からアプリをスライドさせて移動するだけで機能します。 whatsappを殺して、誰かにメッセージを送ってほしいと頼んでやってみましたが、何の通知もありません。その後、アプリを起動し、通知を受け取りました。
GCMアプリを完成しました。アプリを閉じても、それはうまく機能します。事はあなたが既に一度アプリを開いている必要があります。この目標を達成するために、GcmBroadcastReceiver
とGcnIntentService
の2つのクラスを作成します。詳細情報を検索 http://developer.Android.com/google/gcm/index.html
ここにトリックがあります
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(),
GcmIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
拡張されるクラスはWakeFulBroadcastReceiver
です。 Manifest.xmlにWAKE_LOCK権限があります。これにより、PowerManager
WakeLocks
を使用して、プロセッサがスリープ状態にならないようにするか、画面が暗くなるのを防ぐことができます。ただし、BroadcastReceiver
を拡張すると、アプリを閉じた後に機能しなくなります。
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
Firebase APIには2種類のメッセージがあり、それらを呼び出します:
here から詳細情報を検索します
重要:Firebase Consoleからデータペイロードメッセージを送信することはできません。コンソールは通知メッセージのみを配信します。だから私は郵便配達員を使用してプッシュ通知を送信する方法について言及しましたので、そのための以下の手順に従ってください。
データペイロードのために、データペイロードを含むプッシュメッセージを送信する必要があります-アプリケーションがフォアグラウンドまたはバックグラウンドにあるか、強制終了されているかに関係なく、これらのメッセージは常にonMessageReceived()メソッド。
Android 8.0 Oreoでアプリケーションが閉じている場合、通知は受信されませんDOZEモードとバッテリー最適化のため、バッテリーをオフにするだけですすべてのアプリまたは特定のアプリの最適化。
以下の手順でアプリのバッテリー最適化をオフにします。
設定>>バッテリー>>バッテリーの最適化>>アプリを見つける>>選択>>最適化されたクリックが最適化されない場合>>通知をプッシュしてみてください
postmanを使用してプッシュ通知を送信します
ステップ1: https://fcm.googleapis.com/fcm/send
ステップ2:この2つをHeaderに設定します
認可:key = AIzaSyBuRl1Ikz3VXFvU7xW9mmg51lJ3uDSH
Content-Type:application/json
ステップ3:このJSONを送信する
{
"to" : "eb9HgFulyzU:APA91bFMLReWWwilNFfJ1fnXZ0A2PhJAYsabg-UcK_dHgHQcstTzcxLs4_mqgOmZtUiyLMne4JaOG7f8KH7pWxB7JugOGCCYgjd4fUynRBKZvNUgjaj2UdJB2Ux8VocszuUydCX",
"data" : {
"message" : "First Notification",
"title": "Push Notification",
"key_1" : "Key 1 value",
"key_2" : "Hello"
}
}
お役に立てれば..
楽しい :) :)
この問題についていくつかのテストを行った後、アプリがどのように閉じられるかで動作が異なることがわかりました。ケーブルがデバイスに接続されているときにアプリを閉じると、アプリが閉じられたときにすべての通知がブロックされます。ただし、デバイスからケーブルを外してアプリを閉じると、通知を送信するときにすべてが正常に機能します。
「デバッガを待機しています」というポップアップメッセージが表示された場合は、デバイスを再起動してからテスト通知を送信してください!
私は別の電話を試してきましたが、2番目の電話は、電話がオフのときでも完全に機能しました。最初は、アプリが閉じられたときに通知することを許可しない部屋を持っていた...すべてに感謝