1) В моем приложении пользователь может получить много уведомлений от FCM
2) Если у пользователя открыто приложение, ему нужно , чтобы отобразить пользовательский DialogFragment
3) Если DialogFragment уже отображается, то при следующем получении уведомления необходимо запретить повторное отображение этого DialogFragment
4) Мой код диалога:
public final class NotificationEventDialog extends DialogFragment implements DialogInterface.OnKeyListener, View.OnClickListener {
private Activity mCurrentActivity;
private NotificationEventDialogListener mNotificationEventDialogListener;
public interface NotificationEventDialogListener {
void showEvent();
}
public NotificationEventDialog() {
}
public static NotificationEventDialog newInstance() {
NotificationEventDialog notificationEventDialog = new NotificationEventDialog();
notificationEventDialog.setCancelable(false);
return notificationEventDialog;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mCurrentActivity = (Activity)context;
try {
mNotificationEventDialogListener = (NotificationEventDialogListener) mCurrentActivity;
} catch (ClassCastException e) {
throw new ClassCastException(mCurrentActivity.toString() + " must implemented NotificationEventDialogListener");
}
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(mCurrentActivity);
@SuppressLint("InflateParams") View view = inflater.inflate(R.layout.dialog_notification_event, null);
Button btnNotificationEventYes = view.findViewById(R.id.notification_event_dialog_yes);
btnNotificationEventYes.setOnClickListener(this);
Button btnNotificationEventNo = view.findViewById(R.id.notification_event_dialog_no);
btnNotificationEventNo.setOnClickListener(this);
AlertDialog.Builder builder = new AlertDialog.Builder(mCurrentActivity);
builder.setView(view);
return builder.create();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().setOnKeyListener(this);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDetach() {
super.onDetach();
mCurrentActivity = null;
mNotificationEventDialogListener = null;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.notification_event_dialog_yes:
dismiss();
mNotificationEventDialogListener.showEvent();
break;
case R.id.notification_event_dialog_no:
dismiss();
break;
}
}
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
dismiss();
return true;
} else return false;
}
}
5) Каждый раз, когда я получаю уведомление от FCM, я создаю диалоговое окно:
DialogFragment notificationEventDialog = NotificationEventDialog.newInstance();
notificationEventDialog.show(getSupportFragmentManager(), "");
6) Как проверить, отображается ли DialogFragment? Everyвремя я создаю новый объект этого окна, и я не могу сделать его как Singleton, потому что это приводит к утечке памяти.
Найден ответ, в котором человек предлагает использовать слабые ссылки для решения этой проблемы:
Также вы можете сохранить слабую ссылку на отображаемый диалог в этомсинглетный класс.Используя такой метод, вы можете определить, отображается ли ваш диалог в данный момент или нет.
Был также такой ответ:
Предлагаю сохранить ссылку на диалог в классе одного экземпляра.В этом случае создайте метод sureShowDialog (Контекст контекста).Этот метод будет проверять текущее показанное диалоговое окно или нет.Если да, вы можете показать диалог.В другом casr вы можете передать новые данные вам в диалоге.
Но, честно говоря, Я не совсем понимаю, как использовать эти советы на практике .Пожалуйста, можете помочь с этой реализацией или предложить другой способ?Заранее спасибо.