在onMessageReceived中显示警报对话框 - FCM

3

我正在尝试在MyFirebaseMessagingService类的onMessageReceived中显示一个警告消息,但是出现了错误:

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

}

BaseActivity

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

DialogUtil

  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中打开警告对话框?有什么建议吗?

谢谢 R


我非常确定,即使你通过某种奇迹解决了这个问题,你在这里也会遇到一个“NullPointerException”——getApplicationContext()。你不能(当然你可以,但它不会有期望的行为)自己实例化Activity实例并期望它们与框架实例化的Activity相同。 - Mark
好的,做这件事情的正确方式是什么? - BRDroid
个人而言我不会这样做。我会发送一个通知到系统托盘,这是发送通知的正确方式。 - Mark
请问您能否发布SupportActivity.java文件中第38行的代码? - Cao Minh Vu
@CaoMinhVu SupportActicity是'android.support.v4.app'包中的一个类。如果你想要这行代码,这里是它:第38行 - public class SupportActivity extends Activity implements LifecycleOwner { - BRDroid
2个回答

2
这是我的建议:
  1. 使用Activity上下文来显示对话框或任何与UI相关的东西。另外,你启动Activity的方式不正确。你可以选择在顶部栏上显示通知,并在其上设置PendingIntent,以便单击它打开所需的Activity。在FCM中单击通知时打开特定活动

  2. 不要从onMessageReceived获取BaseActivity的引用,保持它们解耦合。使用LocalBroadcastManagerHandler将消息发送到Activity以显示对话框。这样,如果Activity已经打开,它会执行相应操作,否则它不会做任何事情。请参考GCM IntentService如何在接收通知时显示弹出窗口


0
问题出在这一行:BaseActivity baseActivity = new BaseActivity(); 你不应该创建一个 Activity 的实例,它应该通过 Intent 由系统创建。当你使用 "new" 命令创建实例时,它被视为普通类,所有上下文都将是错误的。 思路是启动一个活动并让活动处理对话框。 快速修复如下:
@Override public void onMessageReceived(RemoteMessage remoteMessage) {

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

}

在 BaseActivity.class 中,在 onCreate() 方法中调用 showDialog()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接