收到Firebase通知并且应用程序在后台时显示对话框

时间:2017-06-21 13:48:43

标签: android firebase firebase-cloud-messaging

我有一个老人使用的应用程序,我需要一个非常明显的方式让他们知道他们收到了新的通知,所以我想在屏幕上显示一个对话框,即使应用程序可能已关闭/背景< / p>

我创建了一个扩展Dialog以显示Dialog的类,当我在任何活动中调用它时它都有效:

错误有意义,因为FirebaseMessagingService实际上不是我的类之一,但我不知道如何解决这个问题,感谢输入

由于

4 个答案:

答案 0 :(得分:1)

创建扩展FirebaseMessagingService的类并编写onMessageReceived方法,您可以从中显示通知对话框或者您想做的事情:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

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

答案 1 :(得分:0)

  1. 创建MyFirebaseMessagingService extends FirebaseMessagingService 使用AndroidManifest中的条目和onMessageReceived方法。

  2. 发送数据消息(不是通知/显示消息)。

  3. 使用context.startActivity()启动活动

  4. 将活动样式自定义为对话框

  5. 请参阅:Android Activity as a dialog

答案 2 :(得分:0)

我可能有点晚了,但这是一个完整的解决方案,即使应用程序已关闭或被杀死或在后台,也会强制活动自动打开。该解决方案甚至可以显示&#34;活动/片段&#34;当设备处于睡眠或屏幕锁定状态时。

创建一个活动,该活动将提供通知,并在收到通知时自动打开。

在你的

里面
  

onMessageReceived

执行以下代码

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

这里你的sendNotification()方法是

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);
}

注意两件重要的事情

  

FLAG_ACTIVITY_NEW_TASK   和   。getApplicationContext()startActivity(意向);

在您的活动中,如果您要取消锁定设备屏幕并将设备从设备休眠模式恢复,请在您的活动onCreate()

中执行以下操作
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);

最后一个重要的事情是在firebase消息系统中总是使用&#34;数据有效负载&#34;因为当设备处于后台时调用onMessageReceived()&#34;需要数据有效负载&#34;

要显示任何对话,您可以在活动的onCreateView()或任何地方对其进行编码;

@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();


    }

答案 3 :(得分:0)

如果要显示对话框,则必须通过附加窗口或重定向到看起来像对话框的“活动”来在活动中显示它。或者简单地,您可以在处理程序上使用Toast。