2017-06-21 4 views
0

Ich habe eine App, die ältere Menschen verwenden, und ich brauche eine wirklich bemerkenswerte Möglichkeit für sie zu wissen, dass sie eine neue Benachrichtigung erhalten haben, also möchte ich eine anzeigen Dialog auf dem Bildschirm, auch wenn die App geschlossen werden/HintergrundZeige einen Dialog, wenn Firebase-Benachrichtigung empfangen wird und App im Hintergrund ist

ich habe eine Klasse, die Dialog einen Dialog zu zeigen, erstreckt, und es funktioniert, wenn ich es in keinem meiner Aktivitäten nennen:

der Fehler macht Sinn Da FirebaseMessagingService tatsächlich keine meiner Klassen ist, aber ich weiß nicht, wie ich das umgehen soll, werden Eingaben geschätzt

Dank

+0

Was Sie hier versuchen, ist über andere Anwendungen zu zeichnen. Dazu benötigen Sie das SYSTEM_ALERT_WINDOW, welches bei API23 + explizit in den Systemeinstellungen aktiviert werden muss. Dies ist eine große Sicherheit Haftung und Sie sollten darüber nachdenken, ob dies wirklich erforderlich ist. Mehr lesen: https://stackoverflow.com/a/32652625/1025599. Alternativ können Sie den NotificationManager verwenden, um eine Standardbenachrichtigung anzuzeigen. – Nachi

+0

IMHO, mit einem Dialog * Pop-up * bei einer Benachrichtigung Ankunft ist * schlecht UX *. Es ist wie eine [Popup-Anzeige] (https://en.wikipedia.org/wiki/Pop-up_ad). –

+0

Es ist, aber meine App wird für ältere Menschen verwendet, um ihnen mit ihrer Gesundheitsroutine zu helfen, sie tun nicht, dass sie eine neue Aktivität haben, wenn Sie es wirklich auffällig machen. Es gibt eine korrekte Verwendung für diese Praxis. – dfabiano

Antwort

1

Ihre Klasse erstellen, die FirebaseMessagingService erstreckt und schreiben onMessageReceived Verfahren, von dem Sie Benachrichtigungsdialog zeigen können, oder was auch immer Sie gerne tun:

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

@Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     } 
} 
+0

Das ist genau das, was ich habe, aber die Zeile "alert.showNotificationDialog (FirebaseMessagingService.this" gibt mir einen Fehler, und es tut dasselbe, wenn ich "myclassname.this". – dfabiano

+0

Vielleicht ist das Problem, dass meine ShowedotificationDialog-Funktion eine Aktivität ausführt um die Aktivität an anzuzeigen ... Welche Aktivität überlasse ich jedoch, um den Dialog zu zeigen, wenn die Aktivität im Hintergrund ist? Ich nehme nur eine Vermutung. Ich weiß nicht, ob das das eigentliche Problem ist. – dfabiano

+0

Wenn Sie mit Push umgehen wollen Benachrichtigungsnachricht im Dialog, als Sie Broadcast-Empfänger verwenden müssen. – ashish

0
  1. MyFirebaseMessagingService extends FirebaseMessagingService mit dem Einstieg schaffen, in der AndroidManifest und mit der Methode onMessageReceived.

  2. senden Sie eine Datennachricht (keine Benachrichtigung/Display-Nachricht).

  3. Verwendung context.startActivity() eine Aktivität

  4. anpassen, um die Art der Tätigkeit zu starten, um wie ein Dialog

siehe: Android Activity as a dialog

0

ich ein bisschen sein kann spät, aber hier ist eine vollständige Lösung, die die Aktivität automatisch öffnen, selbst wenn die Anwendung geschlossen oder getötet oder im Hintergrund ist. Diese Lösung kann sogar "Aktivität/Fragment" anzeigen, wenn sich das Gerät im Ruhezustand oder in der Bildschirmsperre befindet.

Erstellen Sie eine Aktivität, die der Benachrichtigung dient und automatisch bei jeder Benachrichtigung geöffnet wird.

in Ihrem

onMessageReceived

folgenden Code Sie

if (remoteMessage.getData().size() > 0) { 
sendNotification(remoteMessage.getData().get("title"),remoteMessage.getData().get("body")); 
} 

hier Ihre sendNotification() -Methode ist

private void sendNotification(String messageTitle,String messageBody) { 
    Intent intent = new Intent(this, DeliveryRecieved.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this,0 /* request code */, intent,PendingIntent.FLAG_UPDATE_CURRENT); 

    long[] pattern = {500,500,500,500,500}; 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_dart_board) 
      .setContentTitle(messageTitle) 
      .setContentText(messageBody) 
      .setVibrate(pattern) 
      .setLights(Color.BLUE,1,1) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
    getApplicationContext().startActivity(intent); 
} 
Hinweiszwei wichtige Dinge

FLAG_ACTIVITY_NEW_TASK und getApplicationContext().startActivity (Absicht);

In Ihrer Tätigkeit, wenn Sie auf Bildschirm un-Lock-Vorrichtung wollen und die Anwendung von Gerät Schlafmodus gehen Sie wie folgt in Ihrer Tätigkeit onCreate bringen()

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 

Die letzte wichtige Sache ist, in firebase messaging system verwendet immer "Datennutzlast", um onMessageReceived() aufzurufen, wenn das Gerät im Hintergrund ist "Datennutzlast ist erforderlich"

Um einen Dialog anzuzeigen, können Sie ihn in onCreateView() Ihrer Aktivität codieren oder wo auch immer;

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    final DeliveryRecieved c = this; 
    setContentView(R.layout.activity_jp_map); 
    mediaPlayer = MediaPlayer.create(this, R.raw.call_bell); 
    mediaPlayer.setLooping(true); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 
     String[] title = {"A","B"}; 
     mediaPlayer.start(); 
     new MaterialDialog.Builder(this) 
       .items(title) 
       .itemsCallbackMultiChoice(null, new MaterialDialog.ListCallbackMultiChoice() { 
        @Override 
        public boolean onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) { 

         mediaPlayer.stop(); 
         c.finish(); 
         return true; 
        } 
       }) 
       .title("NOTICES For Delivery") 
       .content("IMPORTANT NOTICE") 
       .positiveText("Accept") 
       .build().show(); 


    } 
Verwandte Themen