android - 使用应用程序时不要调用推送通知(在前台运行)
问题描述
在我的 android 应用程序中,我通过 Firebase Cloud Messaging 接收推送通知。通知工作得很好,唯一的问题是我不想在应用程序运行时收到通知。当用户使用 ap 时,我已经在内部显示通知,因此推送通知是多余且烦人的。下面是我如何调用推送通知的代码:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_name)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setAutoCancel(true)
.setVibrate(pattern)
.setLights(Color.BLUE,1,1)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, notificationBuilder.build());
}
我在此链接上尝试了解决方案,但在我的情况下它不起作用,因为我确实希望在应用程序处于后台或被终止时收到通知。此外,将布尔值设置为true
应用程序启动时间和false
应用程序关闭时间似乎不是一个理想的解决方案。必须有更好的方法,但我找不到。任何帮助,将不胜感激。
解决方案
我所做的是在您的 Application 类中使用 ActivityLifeCycleCallbacks
class MyApplication:Application(){
companion object {
private var activitiesOpen = 0
var displayActivity:String?= null
private set
fun isAppOpen() = activitiesOpen > 0
}
private val activitiesListener = object : ActivityLifecycleCallbacks{
override fun onActivityPaused(activity: Activity?) {
--activitiesOpen
displayActivity = null
}
override fun onActivityResumed(activity: Activity?) {
activitiesOpen++
displayActivity = if(activity != null)
activity::class.simpleName else null
}
override fun onActivityStarted(activity: Activity?) {
}
override fun onActivityDestroyed(activity: Activity?) {
}
override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
}
override fun onActivityStopped(activity: Activity?) {
}
override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
}
}
}
现在在您的onMessageReceived中,您可以像这样查看它。
if (MyApplication.isAppOpen() &&
DashboardActivity::class.simpleName?
.equals(MyApplication.displayActivity) ?: false) {
// you can eliminate the last condition if you wish
playAlertTone(context) // or whatever
} else {
// your notification building code
}
代码在 kotlin 中,希望你不会有任何问题。
推荐阅读
- c++ - CMake包含不同目录中的头文件
- android - 是否可以将条件类(基于前一个片段中的参数)注入视图模型?
- core-data - 在 SwiftUI 构造函数中使用 @Environment 变量的问题
- python - 如何从我创建的 csv 文件中读取
- list - 如何从列表中最佳地选择有效的整数对?
- android - 带有共享屏幕的 Android 导航组件弹出逻辑
- rust - 为什么不通过优化删除未使用的零初始化向量?
- oracle - 当我使用游标运行包时,ORA-00942 表或视图不存在
- python - 如何从 Django Crispy 的输入中删除表单组?
- while-loop - 如何使用 while 循环检查字符串中的特定字符?