如何在没有服务运行通知的情况下在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?的主要内容,如果未能解决你的问题,请参考以下文章

Android 在没有可展开视图的情况下在状态栏中显示通知

android前台服务以及通知

如何在没有后端服务器的情况下在 24 小时后触发桌面通知?

在不使用 GCM 的情况下在 android 中推送通知

Xamarin Android 从前台通知启动应用程序

如何在科尔多瓦运行android前台服务?