5

Ich habe eine Anwendung, die im Grunde eine Webview und GCM-Benachrichtigungen ist. Ich möchte Folgendes erreichen: Wenn der Benutzer in der App ist und eine Benachrichtigung erhält, wenn er auf die Benachrichtigung klickt, möchte ich im Webview die in der Benachrichtigung angegebene URL laden.Send Broadcast bei Benachrichtigung klicken

Ich versuche, dies durch Verwendung von Broadcast-Empfänger zu erreichen, aber es funktioniert nicht.

ich dynamisch den Empfänger im MainActivity registrieren:

private void registerNotificationReceiver() { 
     final IntentFilter filter = new IntentFilter(); 
     filter.addAction(ACTION_LOAD_URL_FROM_NOTIFICATION); 
     Log.i(TAG, "registerNotificationReceiver()"); 
     this.receiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.d(TAG, "notification received"); 

      } 
     }; 

     super.registerReceiver(this.receiver, filter); 
    } 

Und im GCM Zuhörer Ich verwende PendingIntent.getBroadast():

final Intent broadcastIntent = new Intent(MainActivity.ACTION_LOAD_URL_FROM_NOTIFICATION); 
     PendingIntent intent = PendingIntent.getBroadcast(getApplicationContext(), 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     notificationBuilder.setContentIntent(intent); 

     notification = notificationBuilder.build(); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 

     NotificationManager mNotificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(1, notification); 

Ich verstehe nicht, warum OnReceive in Die MainActivity-Klasse wird nicht aufgerufen. Die Nachricht "Benachrichtigung erhalten" wird nicht angezeigt. Können Sie mir helfen? Danke :)

Antwort

4

Ich kann nicht jetzt den Grund finden, aber es gibt einen Sicherheitsgrund. Die neuesten Android-Versionen ermöglichen es Ihnen nicht, einen Listener von "Art-of" Remote-Prozessen auszulösen, ohne dass dies explizit ist.

Die intentyou Broadcast muss explizit sein, damit es funktioniert. Explizit bedeutet, dass Sie explizit die Komponente aufrufen müssen, die die Absicht behandelt (der Empfänger). Dieser Empfänger muss also in einer eigenen Klasse und im Manifest als <receiver> deklariert sein.

Folgen Sie diesem Beispiel im Abschnitt Explicit Broadcast Intentshttp://codetheory.in/android-broadcast-receivers/ guy's und dein Wille

+1

Ja getan werden, es funktioniert jetzt, wenn der Empfänger im Manifest definiert ist. Danke :) Um mein Ziel zu erreichen, musste ich einen anderen Empfänger in der MainActivity verwenden, wo ich die URL lade. Die Übertragung zu ihm wird von dem ersten Empfänger gesendet (derjenige, den ich im Manifest definiert habe). Es funktioniert jetzt, aber ich mag diesen Ansatz irgendwie nicht. Es sieht für mich wie eine schlechte Übung aus ... – definera

+0

es ist die * Pflicht * Praxis ... Gott Google sagt so ... – eduyayo