Показать диалоговое окно предупреждения в onMessageReceived — FCM

Я пытаюсь показать предупреждающее сообщение в onMessageReceived класса MyFirebaseMessagingService и получаю сообщение об ошибке:

    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
                                                                                    at android.os.Handler.<init>(Handler.java:200)
                                                                                    at android.os.Handler.<init>(Handler.java:114)
                                                                                    at android.app.Activity.<init>(Activity.java:846)
                                                                                    at android.support.v4.app.SupportActivity.<init>(SupportActivity.java:38)
                                                                                    at android.support.v4.app.BaseFragmentActivityApi14.<init>(BaseFragmentActivityApi14.java:28)
                                                                                    at android.support.v4.app.BaseFragmentActivityApi16.<init>(BaseFragmentActivityApi16.java:34)
                                                                                    at android.support.v4.app.FragmentActivity.<init>(FragmentActivity.java:67)
                                                                                    at android.support.v7.app.AppCompatActivity.<init>(AppCompatActivity.java:61)
                                                                                    at com.dopay.onboarding.activity.BaseActivity.<init>(BaseActivity.java:51)
                                                                                    at com.dopay.onboarding.FMS.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:75)
                                                                                    at com.google.firebase.messaging.FirebaseMessagingService.handleIntent(Unknown Source)
                                                                                    at com.google.firebase.iid.zzc.run(Unknown Source)
                                                                                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                                    at java.lang.Thread.run(Thread.java:762)
02

Что я пробовал.

@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        if (remoteMessage.getData().size() > 0) {
 BaseActivity baseActivity = new BaseActivity();
                baseActivity.showDialog();
}

}

Базовая активность

  public void showDialog(){
        this.runOnUiThread(new Runnable() {
            public void run() {
                    //Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();
                DialogUtil.showAlert(getApplicationContext(), R.string.message_complete_required_fields);
            }
        });
    }

ДиалогУтил

  public static void showAlert(Context context, int messageId) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(messageId)
                .setCancelable(true)
                .setPositiveButton(context.getResources().getString(R.string.label_ok), null);
        builder.create().show();
    }

Любые предложения о том, как открыть диалоговое окно предупреждения в onMessageReceived.

Спасибо Р


comment
Я почти уверен, что даже если вы каким-то чудом прошли этот выпуск, вы получите здесь NullPointerException - getApplicationContext(). Вы не можете (ну, вы можете, но это не будет иметь желаемого поведения) самостоятельно создавать экземпляры Activity и ожидать, что они будут работать так же, как созданный фреймворк Activity.   -  person Mark Keen    schedule 23.02.2018
comment
Хорошо, как правильно это сделать.   -  person BRDroid    schedule 23.02.2018
comment
Лично я бы не стал. Я бы отправил уведомление в системный трей, что является правильным способом отправки уведомлений.   -  person Mark Keen    schedule 23.02.2018
comment
Не могли бы вы опубликовать код строки 38 SupportActivity.java   -  person Cao Minh Vu    schedule 23.02.2018
comment
@CaoMinhVu SupportActicity относится к пакету android.support.v4.app. если вы хотите, чтобы эта линия вот она. строка номер 38 — открытый класс SupportActivity расширяет действие, реализует LifecycleOwner {   -  person BRDroid    schedule 23.02.2018


Ответы (2)


Вот мои два цента за вашу проблему:

  1. Используйте контекст Activity для отображения диалога или для любых материалов, связанных с пользовательским интерфейсом. Кроме того, то, как вы начинаете деятельность, не так, как она открывается. Вы можете выбрать отображение уведомления на верхней панели и установить на нем PendingIntent, чтобы при нажатии на него открывалась нужная активность. Открыть определенное действие при нажатии уведомления в FCM

  2. Вместо того, чтобы получать ссылку на BaseActivity из onMessageReceived, держите их несвязанными. Используйте LocalBroadcastManager или Handler, чтобы отправить сообщение в действие, чтобы отобразить диалоговое окно. Таким образом, если действие открыто, оно будет действовать на него, иначе оно ничего не сделает. Проверьте GCM IntentService, как отображать всплывающее окно при получении уведомления

person Shobhit Puri    schedule 23.02.2018

Проблема в этой строке: BaseActivity baseActivity = new BaseActivity(); Вы не должны создавать экземпляр Activity, он должен быть создан системой через Intent. Когда вы создаете экземпляр с помощью команды «новый», он считается обычным классом, и все контексты будут неправильными.

Идея состоит в том, чтобы запустить активность и позволить ей обрабатывать диалоговое окно. Быстрое решение выглядит следующим образом:

@Override public void onMessageReceived(RemoteMessage remoteMessage) {

    if (remoteMessage.getData().size() > 0) {
         Intent intent = new Intent(this, BaseActivity.class);
         startActivity(intent);
    }

}

в BaseActivity.class вызовите showDialog() в методе onCreate().

person Cao Minh Vu    schedule 23.02.2018