我有一个老人使用的应用程序,我需要一个非常明显的方式让他们知道他们收到了新的通知,所以我想在屏幕上显示一个对话框,即使应用程序可能已关闭/背景< / p>
我创建了一个扩展Dialog以显示Dialog的类,当我在任何活动中调用它时它都有效:
错误有意义,因为FirebaseMessagingService实际上不是我的类之一,但我不知道如何解决这个问题,感谢输入
由于
答案 0 :(得分:1)
创建扩展FirebaseMessagingService的类并编写onMessageReceived方法,您可以从中显示通知对话框或者您想做的事情:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
}
}
答案 1 :(得分:0)
创建MyFirebaseMessagingService extends FirebaseMessagingService
使用AndroidManifest中的条目和onMessageReceived
方法。
发送数据消息(不是通知/显示消息)。
使用context.startActivity()启动活动
将活动样式自定义为对话框
答案 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。