it-swarm.com.de

Push-Benachrichtigungen, wenn die App geschlossen ist

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.

26
user3757628

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

21
Sahil Bajaj

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/

18
laalto

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.

5
berserk

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 PowerManagerWakeLocks, 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" />
2
SandyQi

Die Firebase-API verfügt über zwei Arten von Nachrichten, die sie anrufen:

  • benachrichtigung
  • daten

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 :) :)

2
Dhaval Jivani

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!

1
Zez3

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.

 enter image description here

0
Paresh

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

0
user3757628