web-dev-qa-db-ja.com

アプリが閉じられたときにプッシュ通知

アプリケーションが完全に閉じられたときに、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

ユーザーがアプリを強制的に閉じた場合:通知が届かない

何が問題ですか?

どうもありがとうございました。

30
user3757628

はい、「アプリケーションが完全に閉じられたときに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

21
Sahil Bajaj

ユーザーがアプリを完全に閉じた場合:通知が届かない

これは、Androidプラットフォームの機能です。ユーザーがアプリケーションを強制的に停止すると、アプリケーションは停止状態になり、マニフェストで宣言されたブロードキャストレシーバーを含むコードは実行されません。ユーザーが明示的にアプリを起動すると、レシーバーが起動する状態になります。

さらに読むには: http://www.doubleencore.com/2014/06/effects-Android-application-termination/

18
laalto

タスクマネージャーからアプリを強制終了することはできませんが、最近からアプリをスライドさせて移動するだけで機能します。 whatsappを殺して、誰かにメッセージを送ってほしいと頼んでやってみましたが、何の通知もありません。その後、アプリを起動し、通知を受け取りました。

5
berserk

GCMアプリを完成しました。アプリを閉じても、それはうまく機能します。事はあなたが既に一度アプリを開いている必要があります。この目標を達成するために、GcmBroadcastReceiverGcnIntentServiceの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権限があります。これにより、PowerManagerWakeLocksを使用して、プロセッサがスリープ状態にならないようにするか、画面が暗くなるのを防ぐことができます。ただし、BroadcastReceiverを拡張すると、アプリを閉じた後に機能しなくなります。

<uses-permission Android:name="Android.permission.WAKE_LOCK" />
2
SandyQi

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
Dhaval Jivani

この問題についていくつかのテストを行った後、アプリがどのように閉じられるかで動作が異なることがわかりました。ケーブルがデバイスに接続されているときにアプリを閉じると、アプリが閉じられたときにすべての通知がブロックされます。ただし、デバイスからケーブルを外してアプリを閉じると、通知を送信するときにすべてが正常に機能します。

「デバッガを待機しています」というポップアップメッセージが表示された場合は、デバイスを再起動してからテスト通知を送信してください!

1
Zez3

Oneplus電話でも同じ問題が発生していました。上記の多くの人々が言及したように、問題はアプリの強制終了でした。私の場合、以下に示すように「最近のアプリ管理」設定が原因で行われました。 「通常クリア」設定に変更すると、すべてが正常に動作し始めました。

enter image description here

0
Paresh

私は別の電話を試してきましたが、2番目の電話は、電話がオフのときでも完全に機能しました。最初は、アプリが閉じられたときに通知することを許可しない部屋を持っていた...すべてに感謝

0
user3757628