Wissen Sie, ob es möglich ist, Benachrichtigungen von Google Cloud-Nachrichten zu erhalten, wenn die Anwendung vollständig geschlossen ist?
Ich weiß, ob es offen ist oder sich im Hintergrund befindet, aber kann es auf irgendeine Weise programmiert werden, um sie zu empfangen?
BEARBEITEN:
Ich fahre fort, ohne Benachrichtigungen zu erhalten, wenn die App geschlossen wird.
Ich habe den Code angehängt, falls ich einen Fehler habe und ihn nicht sehe.
MANIFEST
<?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>
RUNDFUNKEMPFÄNGER
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);
}
}
Wenn die App geöffnet ist:OK
Wenn sich die App im Hintergrund befindet: Ok
Wenn die App vom Benutzer zwangsweise geschlossen wird: Benachrichtigungen kommen nicht an
Worin besteht das Problem?
Vielen Dank.
Ja, es ist möglich, Benachrichtigungen von der Google-Cloud-Benachrichtigung zu erhalten, wenn die Anwendung vollständig geschlossen ist.
Infact, ein Broadcast-Empfänger ist der Mechanismus, den GCM verwendet, um Nachrichten zu übermitteln. Sie müssen einen BroadcastReceiver implementieren und in der AndroidManifest.xml deklarieren.
Bitte beachten Sie den folgenden Code-Ausschnitt.
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-Code
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);
}
}
Wenn GCM eine Nachricht an Ihr Gerät sendet, empfängt BroadcastReceiver
die Nachricht und ruft die Funktion onReceive()
auf, in der Sie einen Dienst starten können, um die beabsichtigte Aufgabe tatsächlich für Sie auszuführen.
Das obige Codebeispiel verwendet eine spezielle BroadcastReceiver
mit dem Namen WakefulBroadcastReceiver
, die sicherstellt, dass das Gerät nicht in den Ruhezustand wechselt, während der Dienst seine Arbeit erledigt.
Weitere Informationen finden Sie auf der offiziellen Android-Seite: https://developer.Android.com/google/gcm/client.html
Wenn die App vom Benutzer forcelly geschlossen wird: Benachrichtigungen kommen nicht an
Es ist eine Funktion der Android-Plattform. Durch das erzwungene Stoppen einer Anwendung durch den Benutzer wird die Anwendung in einen angehaltenen Status versetzt, und es wird kein Code ausgeführt, einschließlich der in Manifest deklarierten Rundfunkempfänger. Erst wenn der Benutzer die App explizit startet, wird er in einen Zustand versetzt, in dem die Empfänger ausgelöst werden.
Für weitere Lektüre: http://www.doubleencore.com/2014/06/effects-Android-application-termination/
Es funktioniert nicht beim Beenden der App über den Task-Manager, aber es funktioniert, wenn Sie es einfach vom letzten entfernen. Ich habe versucht, WhatsApp zu töten, indem ich es töte, und jemanden bitten, mir eine SMS zu senden, und ich habe keine Benachrichtigung. Dann habe ich die App gestartet und erhielt eine Benachrichtigung.
Ich habe gerade eine GCM-App fertiggestellt ... Es funktioniert immer noch gut, wenn Sie die App schließen. Sie sollten die App bereits einmal geöffnet haben. Erstellen Sie zwei Klassen, um dieses Ziel zu erreichen: GcmBroadcastReceiver
und GcnIntentService
. Weitere Informationen finden Sie unter http://developer.Android.com/google /gcm/index.html
Hier ist der Trick
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);
}
}
die Klasse, die erweitert wird, ist WakeFulBroadcastReceiver
. In Ihrer Manifest.xml ist eine WAKE_LOCK-Berechtigung vorhanden. Dies ermöglicht die Verwendung von PowerManager
WakeLocks
, um zu verhindern, dass der Prozessor im Ruhezustand ist oder der Bildschirm nicht gedimmt wird ..__ Wenn Sie jedoch BroadcastReceiver
erweitern, funktioniert es nicht, nachdem die App geschlossen wurde.
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
Die Firebase-API verfügt über zwei Arten von Nachrichten, die sie anrufen:
weitere Informationen finden Sie unter hier
WICHTIG: Sie können keine Daten-Nutzlastnachrichten von Firebase Console senden. Die Konsole liefert nur eine Benachrichtigungsnachricht. Ich habe also erwähnt, wie man eine Push-Benachrichtigung mit dem Postboten verschickt.
Sie müssen Push-Nachrichten mit Datennutzlast senden, da sich Ihre Anwendung im Vordergrund oder Hintergrund befindet oder abgebrochen ist. Diese Nachrichten werden immer an die onMessageReceived () -Methode übermittelt.
Wenn in Android 8.0 Oreo die Anwendung geschlossen wird, wird keine Benachrichtigung empfangen. Der DOZE-Modus und die Batterieoptimierung sind die Folge. Sie müssen lediglich die Batterieoptimierung für alle Apps oder bestimmte Apps deaktivieren.
Deaktivieren Sie die Batterieoptimierung für Ihre App wie folgt:
Einstellungen >> Akku >> Akkuoptimierung >> Finden Sie Ihre App >> Wählen Sie >> Wenn Optimiert Klicken Klicken Sie Nicht Optimieren >> Versuchen Sie, Pushbenachrichtigung zu starten
Push-Benachrichtigung mit postman senden
Schritt 1: https://fcm.googleapis.com/fcm/send
Schritt 2: Setzen Sie diese beiden in Header
Berechtigung: Schlüssel = AIzaSyBuRl1Ikz3VXFvU7xW9mmg51lJ3uDSH
Content-Type: application/json
Schritt 3: Senden Sie diesen Json
{
"to" : "eb9HgFulyzU:APA91bFMLReWWwilNFfJ1fnXZ0A2PhJAYsabg-UcK_dHgHQcstTzcxLs4_mqgOmZtUiyLMne4JaOG7f8KH7pWxB7JugOGCCYgjd4fUynRBKZvNUgjaj2UdJB2Ux8VocszuUydCX",
"data" : {
"message" : "First Notification",
"title": "Push Notification",
"key_1" : "Key 1 value",
"key_2" : "Hello"
}
}
Hoffe das hilft..
Genießen :) :)
Nach einigen Tests zu diesem Problem habe ich herausgefunden, dass es sich beim Schließen der App anders verhält. Wenn Sie die App schließen, während das Kabel mit dem Gerät verbunden ist, blockiert es dann jede Benachrichtigung, wenn die App geschlossen wird. Wenn Sie jedoch das Kabel vom Gerät trennen und die App schließen, wird beim Senden der Benachrichtigung alles angezeigt funktioniert wieder wie es sollte!
Wenn Sie eine Popup-Nachricht "Warten auf Debugger" erhalten, starten Sie das Gerät neu und senden Sie eine Testbenachrichtigung!
Ich hatte das gleiche Problem mit dem Oneplus-Telefon. Wie bereits von vielen Leuten erwähnt, war das Problem eine zwingende App-Beendigung. In meinem Fall wurde dies aufgrund der Einstellung "Letzte App-Verwaltung" wie folgt durchgeführt. Nachdem ich die Einstellung auf "Normal clear" geändert hatte, funktionierte alles einwandfrei.
Ich habe ein anderes Telefon ausprobiert und das zweite hat einwandfrei funktioniert, auch wenn das Telefon ausgeschaltet war. Der erste hatte ein Zimmer, in dem nicht benachrichtigt werden konnte, wenn die App geschlossen wurde ... Vielen Dank an alle