0

Ich arbeite derzeit an GCM-Benachrichtigungen, insbesondere auf Silent-Push-Benachrichtigung. Im Moment erhalte ich die stille Benachrichtigung, auch wenn die App geschlossen ist (was das Ziel meiner Benachrichtigung ist). Das Problem ist der Code, den ich auszuführen versuche, wenn diese stille Push-Benachrichtigung empfangen:Verwenden Sie UserSingleton mit Null-Kontext (Silent Push-Benachrichtigung)

private void sendPingNotification() { 
    mWebServiceCoordinator = new WebServiceCoordinator(UserSingleton.getContext(), this); 
    mWebServiceCoordinator.fetchSessionConnectionData(
      UserSingleton.getInstance().getLogin(), 
      UserSingleton.getInstance().getPassword(), 
      UserSingleton.getInstance().getDeviceId(), 
      UserSingleton.getInstance().getDeviceType(), 
      UserSingleton.getInstance().getAvailability()); 
} 

Wie Sie sehen können, habe ich die UserSingleton-Login, Passwort, etc ... zu meinem Server senden möchten. Zuerst erstelle ich einen neuen WebServiceCoordinator, der den Kontext von UserSingleton in Parameter übernimmt. Und hier gibt es ein Problem: Da die Anwendung vollständig geschlossen ist, gibt es keinen Kontext! Hier ist die Funktion versucht, den Kontext in meinem UserSingleton zu bekommen:

public static Context getContext() { 
    if (context == null) { 
     if (MainActivity.isRunning) { 
      context = MainActivity.getContext(); 
     } else { 
      Log.e(LOG_TAG, "Unable to get the context"); 
     } 
    } 
    return context; 
} 

Diese Funktion einwandfrei funktioniert, wenn die Anwendung ausgeführt wird. Aber da die Anwendung geschlossen ist und nichts läuft, auch nicht MainActivity, ist der Wert des von der Funktion zurückgegebenen Kontextes immer noch Null

Also der nächste Teil meiner sendPingNotification() funktioniert nicht ... I ' Ich bin mir ziemlich sicher, dass es keinen Weg gibt, einen Kontext zu erhalten, wenn eine Anwendung nicht läuft (das ist logisch), aber wie kann ich meine UserSingleton-Methoden noch verwenden? Weil sie brauchen einen Kontext zu arbeiten, für exemple, die getSharedValue() -Methode:

public String getSharedValue(String key, String defaultValue) { 
    final SharedPreferences data_r = UserSingleton.getContext().getSharedPreferences(SHARED_KEY, Context.MODE_PRIVATE); 
    return data_r.getString(key, defaultValue); 
} 

Irgendwelche Ideen? Dank

------ ------ EDIT

import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 

public class MyGcmListenerService extends GcmListenerService implements WebServiceCoordinator.Listener { 

private static final String TAG = "MyGcmListenerService"; 
private WebServiceCoordinator mWebServiceCoordinator; 

/** 
* Called when message is received. 
* 
* @param from SenderID of the sender. 
* @param data Data bundle containing message data as key/value pairs. 
*    For Set of keys use data.keySet(). 
*/ 
@Override 
public void onMessageReceived(String from, Bundle data) { 
    String type = data.getString("type"); 
    String title = data.getString("title"); 
    String message = data.getString("message"); 
    Log.d(TAG, "Notification from " + from + " : (" + type + ")" + " " + message); 

    if (type.equals("appointment_details")) { 
     String nom = data.getString("nom"); 
     String prenom = data.getString("prenom"); 
     String mail = data.getString("mail"); 
     String telephone = data.getString("telephone"); 
     String state = data.getString("state"); 
     Integer stateId = Integer.parseInt(data.getString("stateId")); 
     String date = data.getString("date"); 
     String token = data.getString("token"); 
     String length = data.getString("length"); 
     sendDetailsRendezvousNotification(title, message, nom, prenom, mail, telephone, state, stateId, date, token, length); 
    } 
    else if (type.equals("appointment")) 
     sendNormalNotification(title, message); 
    else if (type.equals("newCall")) 
     sendNewCallNotification(); 
    else if (type.equals("ping")) 
     sendPingNotification(); 
    else if (type.equals("normal")) 
     sendNormalNotification(title, message); 
} 

private void sendPingNotification() { 
    mWebServiceCoordinator = new WebServiceCoordinator(UserSingleton.getContext(), this); 
    mWebServiceCoordinator.fetchSessionConnectionData(UserSingleton.getInstance().getLogin(), 
      UserSingleton.getInstance().getPassword(), 
      UserSingleton.getInstance().getDeviceId(), 
      UserSingleton.getInstance().getDeviceType(), 
      UserSingleton.getInstance().getAvailability()); 
    } 
} 
+0

können Sie auf jeden Fall Kontext abrufen, auch wenn die App nicht ausgeführt wird. Zeigen Sie die gesamte Klasse an, in der Ihre Benachrichtigung eingegangen ist. Wenn Sie GCM verwenden, sollten Sie eine Funktion erhalten, die einen Kontext als Parameter haben soll. –

+0

@TomerShemesh hat die Klasse hinzugefügt, die die GCM-Benachrichtigungen am Ende meines Posts erhält. Das würde bedeuten, dass ich folgendes tun muss: 'mWebServiceCoordinator = new WebServiceCoordinator (CONTEXT_OF_MYGCMLISTENER_SERVICE, this);'? – Eliott

+0

sehen Sie mir die Antwort unten. Ich denke, das könnte Ihr Problem lösen –

Antwort

0

Ok im ziemlich sicher, dass Sie getApplicationContext verwenden können, den Kontext in einem GCM Service

mWebServiceCoordinator = new WebServiceCoordinator(getApplicationContext(), this); 
+0

Ich bin mir ziemlich sicher, es behebt die erste Zeile von sendPingNotification(), ich werde es morgen versuchen (nicht bei der Arbeit gerade jetzt). Ich werde Sie wissen – Eliott

+0

Ich denke, Sie sollten auch ändern, wie Sie Kontext in Ihrem Singleton bekommen. Die Art, wie du es hast, ist kein guter Weg. Sie sollten den Singleton mit einem Kontext instanziieren, der so gespeichert wird. Wenn Sie ihn in Ihrem Dienst erstellen, versucht er nicht, den Hauptaktivitätskontext zu verwenden –

0

Also ich zu bekommen mein sendPingNotification() Verfahren wie folgt geändert:

private void sendPingNotification() { 
    mWebServiceCoordinator = new WebServiceCoordinator(getApplicationContext(), this); 
    UserSingleton.setContext(getApplicationContext()); 
    mWebServiceCoordinator.fetchSessionConnectionData(UserSingleton.getInstance().getLogin(), 
      UserSingleton.getInstance().getPassword(), 
      UserSingleton.getInstance().getDeviceId(), 
      UserSingleton.getInstance().getDeviceType(), 
      UserSingleton.getInstance().getAvailability()); 
} 

ich eine setContext() Methode inhinzugefügt, so dass ich den Kontext meines UserSingletons als getApplicationContext() festlegen kann. Der Kontext ist nicht mehr null und getContext() gibt eine gültige Context zurück. Alles funktioniert! Danke an euch zwei.