【问题标题】:Show an Alert Dialog in onMessageReceived - FCM在 onMessageReceived 中显示警报对话框 - FCM
【发布时间】:2018-02-22 23:55:33
【问题描述】:

我试图在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();
}

}

基础活动

  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 中打开警报对话框的任何建议。

谢谢 回复

【问题讨论】:

  • 我很确定,即使你奇迹般地通过了这个问题,你也会在这里得到一个NullPointerException - getApplicationContext()。您不能(当然可以,但它不会有所需的行为)自己实例化 Activity 实例并期望它们与实例化 Activity 的框架一样工作。
  • 好的,正确的做法是什么。
  • 我个人不会。我会向系统托盘发送通知,这是发送通知的正确方式。
  • 能否请您发布 SupportActivity.java 的第 38 行代码
  • @CaoMinhVu SupportActicity 属于“android.support.v4.app”包。如果你想要那条线在这里。第 38 行 - 公共类 SupportActivity 扩展 Activity 实现 LifecycleOwner {

标签: android firebase-cloud-messaging android-alertdialog java-threads android-thread


【解决方案1】:

对于您的问题,这是我的两分钱:

  1. 使用 Activity 上下文显示对话框或任何与 UI 相关的内容。还有你开始活动的方式,这不是它的打开方式。您可以选择在顶部栏显示通知并在其上设置PendingIntent,以便单击它打开所需的活动。 Open specific Activity when notification clicked in FCM

  2. 不要从onMessageReceived 获取对BaseActivity 的引用,而是将它们解耦。使用LocalBroadcastManagerHandler 向Activity 发送消息以显示对话框。这样,如果活动是打开的,它将对其采取行动,否则它不会做任何事情。检查GCM IntentService how to display a pop up on notification receive

【讨论】:

    【解决方案2】:

    问题是这一行: BaseActivity baseActivity = new BaseActivity(); 您不应该创建 Activity 的实例,它应该由系统通过 Intent 创建。当你通过“new”命令创建实例时,它被认为是一个普通的类,所有的上下文都是错误的。

    这个想法是启动一个活动并让活动处理对话框。 快速修复是这样的:

    @覆盖 public void onMessageReceived(RemoteMessage remoteMessage) {

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

    }

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多