2016-10-19 2 views
0

Ich habe eine Benachrichtigung über die Firebase-Konsole mit Schlüsselpaar gesendet und die Benachrichtigung in der Launcher-Aktivität bearbeitet. unten ist der versuchte Code:Wie öffne ich die zielgerichtete Aktivität beim Klicken auf die Benachrichtigung, wenn die App im Hintergrund ist

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    if (intent.hasExtra("click_action")) { 
     ClickActionHelper ck=new ClickActionHelper(); 
     ck.startActivity(intent.getStringExtra("click_action"), intent.getExtras(), this); 
    } 
} 



public class ClickActionHelper { 
    public void startActivity(String className, Bundle extras, Context context){ 
     Class cls=null; 
     try { 
      cls = Class.forName(className); 
     }catch(ClassNotFoundException e){ 

     } 
     Intent i = new Intent(context, cls); 
     i.putExtras(extras); 
     context.startActivity(i); 
    } 
} 

aber auf diese Weise kann ich nicht die gezielte Aktivität auf Klick der Benachrichtigung öffnen. Irgendwelche Ideen?

+1

Lesen Sie https://developer.android.com/training/notify-user/navigation.html – Raghunandan

+0

@Raghunandan meine Frage ist anders, ich muss eine bestimmte Aktivität starten und das kann jede Aktivität in der App.so ich brauche um alle Attribute zu definieren, die im obigen Link für jede Aktivität angegeben sind und was ist, wenn ich ein Fragment laden muss? – chandra

+0

Ich hätte Typ für jede Aktivität zu öffnen. Basierend darauf benutze ich einen Switch Case und navigiere zu dieser speziellen Aktivität. Das Fragment wird von einer Aktivität gehostet. Also müssen Sie ein Fragment in diesem Fall – Raghunandan

Antwort

1

Wenn Sie in einer beliebigen Aktivität navigieren müssen, sollte eine Bindung mit Notification class(NotificationCompat.Builder) vorliegen, die in der Implementierung fehlt.

Below Linie ist sehr wichtig, jede Aktivität zu umleiten:

NotificationCompat.Builder builder = new **NotificationCompat.Builder(this); builder.setContentIntent(resultPendingIntent);** 

Hier resultPendingIntent wird verwendet für den Backstack für die Aktivität zu enthalten, mit den Mitteilungen nach unten:

// Ruft einen PendingIntent das enthält gesamte Rückseite Stapel PendingIntent

resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

Der komplette Code-Schnipsel ist here verfügbar.

int id = 1; 

Intent resultIntent = new Intent(this, ResultActivity.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(ResultActivity.class); 
// Adds the Intent to the top of the stack 
stackBuilder.addNextIntent(resultIntent); 
// Gets a PendingIntent containing the entire back stack 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 

NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
builder.setContentIntent(resultPendingIntent); 
NotificationManager mNotificationManager = 
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(id, builder.build()); 

Edit:

  • Lassen Sie mich erklären, wie es funktioniert wird
  • Angenommen, Sie Antwort vom Server wie unten

    { "registration_ids" gesetzt werden: [ "XXX ", ...], " Daten ": { " id_offer ":" 41 " }, "Benachrichtigung": { "title": "Das ist der Titel", "text": "Hallo, ich bin eine Benachrichtigung", "Symbol": "ic_push", "click_action": "ACTIVITY_XPTO" }}

und in Ihrer Manifest-Datei

<activity android:name=".ActivityXPTO" android:screenOrientation="sensor" android:windowSoftInputMode="stateHidden"> <intent-filter> <action android:name="ACTIVITY_XPTO" /> 
<category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 

Wenn die App geschlossen ist oder im Hintergrund und der Benutzer klickt auf die Benachrichtigung öffnet es meine ActivityXPTO, die 012 abrufenIch brauche nur zu tun: wie unten durch Datennutzlast

public class ActivityXPTO extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 
     String idOffer = ""; 
     Intent startingIntent = getIntent(); 
     if (startingIntent != null) { 
      idOffer = startingIntent.getStringExtra("id_offer"); 
     // Retrieve the id 
     } 
     getOfferDetails(id_offer); 
     } 
    } 
} 

Und in Second Way

  • Senden-Taste und Schlüssel in MainActivity über getIntent() und rufen spezifische Aktivität oder Fragmente erhalten.

    json1.put ("Titel", "Ihr Titel");

    json1.put ("Körper", "Körperinhalt");

    json1.put ("Nachricht", "Ihre Nachricht");

    json1.put ("Bildschirm", "2"); // secondFragment ist die 2. Position in der Navigationsleiste

    json.put ("Daten", json1);

Beispielprojekt unter GitHub.

+0

Nach obigem Code, wenn Benutzer auf die Benachrichtigung klicken ResultActivity.class wird geöffnet. aber in meinem Code versuche ich Klassenname in den Wert von key: click_action über Firebase-Konsole. Ich möchte diese bestimmte Klasse öffnen, die in der Firebase-Konsole definiert ist .. ist das möglich? – chandra

+1

Ich habe die Antwort im Abschnitt "Bearbeiten" bearbeitet. Bitte gehen Sie es durch. Lass es mich wissen, ist es hilfreich für dich oder nicht. –

+1

Hervorragende Antwort :) Danke Patrick – chandra

Verwandte Themen