如何在没有服务运行通知的情况下在android前台服务中设置通知接收器......如Whatsapp和Telegram?
Posted
技术标签:
【中文标题】如何在没有服务运行通知的情况下在android前台服务中设置通知接收器......如Whatsapp和Telegram?【英文标题】:How to set notification receiver in android foreground service without notification of service running ...like Whatsapp and Telegram? 【发布时间】:2020-12-16 11:42:46 【问题描述】:我正在开发一个像 whatsapp 和电报这样的聊天信使,我想要一个前台接收器,用于在通知栏中显示消息......但是在最新版本的 android 中,我们应该设置一个通知来告知我们的服务正在运行前台,但在著名的信使中我们没有看到这个通知......我想知道我该怎么做
这是我扩展服务类的 Message_Receiver 类
class Message_Receiver : Service()
private var mSocket: Socket? = null
lateinit var username : String
lateinit var notifmanag : NotificationManagerCompat
lateinit var notifbuilder : NotificationCompat.Builder
val CHANNEL_ID = "Messages"
lateinit var respondData : JSONObject
lateinit var type : String
lateinit var roomname : String
lateinit var roompic : String
lateinit var sender : String
lateinit var senderpic : String
lateinit var msg : String
lateinit var timeStamp : String
override fun onBind(intent: Intent?): IBinder?
return null
override fun onStartCommand(intent: Intent?, flags2: Int, startId: Int): Int
//Service().startForeground(11,notifbuilder.build())
return super.onStartCommand(intent, flags2, startId)
override fun onDestroy()
super.onDestroy()
mSocket?.disconnect()
override fun onCreate()
super.onCreate()
username = MySharedPreference("profile",this).load("username","string") as String
// Notification preconfigurations //////////////////////////////////////////////////////////
notifmanag = NotificationManagerCompat.from(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
val channel = NotificationChannel(CHANNEL_ID, "Message_Channel", NotificationManager.IMPORTANCE_DEFAULT)
channel.description = "Message_Channel"
//notifmanag = getSystemService(Context.NOTIFICATION_SERVICE)
notifmanag.createNotificationChannel(channel)
val intent2 = Intent(this, RoomActivity::class.java).apply
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent2, 0)
// Conncect to socket //////////////////////////////////////////////////////////////////////
// Listener for new messages ///////////////////////////////////////////////////////////////
val onNewMessage = Emitter.Listener
respondData = it[0] as JSONObject
sender = respondData.getString("sender")
notifbuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setAutoCancel(true)
if (roomname == "PRIVATE")
notifbuilder.setContentTitle(username)
.setContentIntent(pendingIntent)
else
notifbuilder.setContentTitle(roomname)
.setContentIntent(pendingIntent)
when (type.toUpperCase(Locale.ROOT))
"TEXT" -> notifbuilder.setContentText(msg)
.setSmallIcon(R.drawable.nearoom_icon2)
"PHOTO" -> notifbuilder.setContentText("Photo : " + msg)
.setSmallIcon(R.drawable.nearoom_icon2)
"VIDEO" -> notifbuilder.setContentText("Video : " + msg)
.setSmallIcon(R.drawable.nearoom_icon2)
notifmanag.notify(12,notifbuilder.build())
mSocket?.on("new message",onNewMessage)
【问题讨论】:
你可以使用firebase来管理通知,见firebase.google.com/docs/cloud-messaging希望对你有帮助 @JefersonMacedo 是的,我对此有所了解,但我想将我的注册用户和聊天记录保存在我的数据库中... 我认为,如果您实现 onMessageReceived 并在通知数据属性和 onMessageReceived 方法中传递您想要的信息,您可以将其保存在您的数据库中,请参见此处firebase.google.com/docs/cloud-messaging/android/receive 【参考方案1】:这些应用程序不使用服务,因此它们不需要状态栏中的任何持久通知。推送通知(当消息到达时)使用 Firebase,而凌晨 02:00 的备份使用设置为该时间的 JobScheduler。
【讨论】:
感谢您的回答...我唯一的问题是我可以使用 fcm 推送通知但不使用 firebase 的寄存器和数据库吗? Firebase 需要为您的每个用户存储一个(它自己的)ID,这样您就可以向特定用户(使用您的 ID)发送推送通知,Firebase 会将您的 ID 转换为其中一个已存储在其数据库中 谢谢...我修好了以上是关于如何在没有服务运行通知的情况下在android前台服务中设置通知接收器......如Whatsapp和Telegram?的主要内容,如果未能解决你的问题,请参考以下文章