2

Ich möchte GCM-Daten vom Empfänger zur Aktivität freigeben. Wenn die Aktivität aktiv/onResume/onPause-Status ist, möchte ich die Daten für die Aktivität anzeigen. Wenn die Aktivität zerstört wurde, möchte ich diese Informationen in der Benachrichtigungsleiste anzeigen.Empfängerdaten an Aktivität senden

Receiver -> GcmMessageHandler.class

import android.os.Bundle; 
import com.google.android.gms.gcm.GcmListenerService; 

public class GcmMessageHandler extends GcmListenerService { 

    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     String message = data.getString("message"); 
     createNotification(message); 
    } 

    private void createNotification(String body) { 
     String sendDataToActivity = body; // This is value i want to pass to activity 
    } 

} 

Aktivität -> MainActivity.class

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    TextView textView; 
    String RECEIVER_VALUE; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView = (TextView) findViewById(R.id.textView); 

     textView.setText(RECEIVER_VALUE); // Here i want to set the receiver valiue 
    } 
} 

Und hier die Benachrichtigungsfunktion.

private void Notify(String notificationMessage){ 
     Notification notification = new Notification.Builder(getBaseContext()) 
      .setContentText(notificationMessage) // Show the Message Here 
      .setSmallIcon(R.drawable.ic_menu_gallery) 
      .setWhen(System.currentTimeMillis()) 
      .build(); 

    notification.notify(); 
} 

Ich verwende bereits die Absicht, von onNewIntent-Methode in Activity zu erhalten.

von Receiver ->

Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
intent.putExtra("message",message); 
getApplicationContext().startActivity(intent); 

und Aktivität ->

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    String message = intent.getExtras().getString("message").toString(); 
    textView.setText(message); 
} 

Aber das Problem ist, wenn meine Tätigkeit der Nähe ist es, die Aktivität wieder öffnen. Jede andere Lösung außer diesem?

+0

Sie können die Daten von Broadcastempfänger zu Aktivität übertragen.Registrieren Sie einen Empfänger in Aktivität in OnCreate und die Registrierung in onDestroy.Als können Sie eine Variable in SharedPreference hinzufügen, um jedes Mal zu aktualisieren Aktivität fortgesetzt, aktiv, auch onDestroy pausiert. Sie können von Ihrem Broadcast-Empfänger aus prüfen, ob Daten an Aktivitäten gesendet werden sollen. – Vijay

+0

Aber ich denke, es wird nicht ausgeführt oder benachrichtigt, wenn die Anwendung in der Nähe ist. –

+0

In Ihrer Funktion createNotification (String body)> überprüfen Sie einfach den Wert aus SharedPreference für Activity State und wenn die Aktivität läuft, übergeben Sie die Daten andernfalls an showNotification. – Vijay

Antwort

1

Sie können EventBus verwenden, die für so:

in Ihrer Anwendungsklasse

@Override 
public void onCreate() { 
    super.onCreate(); 

    EventBus.builder() 
      .logNoSubscriberMessages(false) 
      .sendNoSubscriberEvent(false) 
      .throwSubscriberException(false) 
      .installDefaultEventBus(); 

} 

diese Methode auf Aktivität hinzufügen, wird diese jedes Mal machen Sie einen Beitrag durch EventBus aufgerufen werden.

@Subscribe 
public void onEventFromReceiver(ReceiverEvent event){ 
    Log.d(TAG, event.message); 
} 

Auf Ihrer Methode "Daten Aktivität senden"

EventBus.getDefault().post(new ReceiverEvent(message)); 

Und Ihre ReceiverEvent Klasse

public class ReceiverEvent { 

    public final String message; 

    public ReceiverEvent(String message) { 
     this.message = message; 
    } 

} 

Auf diese Weise, wenn die Aktivität nicht sichtbar oder die App ist auf dem Hintergrund, Nichts wird passieren.

Dies ist das EventBus Projekt

Hoffe, es hilft.