【问题标题】:Build Notification received from Firebase in Library Project在图书馆项目中从 Firebase 收到的构建通知
【发布时间】:2019-02-04 07:11:33
【问题描述】:

我在应用程序级别实现了Firebase 来接收推送消息。在库项目中,我有一个BroadcastReceiver 来拦截推送消息。我想从库而不是从应用程序构建通知。
如果应用程序处于前台状态,当我创建 Pending Intent 时,MainActivity 上下文 在应用程序级别可用 将在未决 Intent 中传递,如果点击通知,我被重定向到 MainActivity。现在,如果应用程序处于终止状态并收到推送消息,我在库中的广播接收器会拦截传入消息,但无法创建通知,因为 MainActivity 上下文在应用程序级别作为 MainActivity 为空在堆栈跟踪中不可用。任何人都可以帮助如何实现这一目标?

下面是我的代码:

val mIntent = Intent(applicationContext,activityContext::class.java)
val pendingIntent = PendingIntent.getActivity(applicationContext, System.currentTimeMillis().toInt(),
mIntent,PendingIntent.FLAG_UPDATE_CURRENT)

其中,Intent 中的 activityContext 是在库项目中从应用级别接收到的 MainActivity 的上下文。

当应用处于前台状态时,activityContext可用并生成通知。但是当应用处于 killed 状态 时,activityContext 仍然为 null,从而导致构建通知失败。

【问题讨论】:

  • 当您的应用程序不在前台时,Firebase 不会自动生成并显示通知吗?
  • @Dhaval Firebase 仅触发将消息推送到 Android 设备。它取决于通知是消息类型还是数据类型。对于消息类型,Android OS 在通知托盘中自行处理并生成它们,但是我们无法提取随之发送的数据负载。使用数据类型通知,我们可以获得有效负载,但必须自己创建通知。由于我们正在遵循后面的方法,所以遇到了问题。

标签: android firebase kotlin android-pendingintent android-push-notification


【解决方案1】:

您不需要ActivityContext,因为如果应用没有运行,它就不存在。

您应该让应用程序将MainActivity名称 传递给库(即:完全限定的类名)。然后库可以使用MainActivity名称 来设置Intent 中的组件参数。

这意味着而不是这个:

val mIntent = Intent(applicationContext,activityContext::class.java)

你想做这样的事情(我的 Kotlin 语法可能是错误的,抱歉):

val mIntent = Intent()
mIntent.setClassName(applicationContext, nameOfMainActivity)

【讨论】:

  • 我明白了。看起来您需要一个钩子,以便库代码可以调用应用程序提供的方法,该方法将返回 MainActivity 的名称。然后您的BroadcastReceiver 将在onReceive() 中调用该方法以确定MainActivity 的名称。另一种方法是在清单中添加一些“元数据”,您的BroadcastReceiver 可以读取这些“元数据”以确定MainActivity 的名称。或者,您可以将 MainActivity 的名称存储在 SharedPreferences
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多