Android 创建自定义大通知

Android 创建自定义大通知,android,android-layout,android-notifications,Android,Android Layout,Android Notifications,我想创建一个包含一些控件的通知。由于文本和控件的默认通知大小(64dp)很小,所以我希望它比默认大小大。 可以创建更大的通知,我认为也可以自定义布局,但我不知道如何创建 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"

我想创建一个包含一些控件的通知。由于文本和控件的默认通知大小(64dp)很小,所以我希望它比默认大小大。
可以创建更大的通知,我认为也可以自定义布局,但我不知道如何创建

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
更具体地说,下面的屏幕截图显示了spotify的通知(图像拍摄自):

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
如您所见,大小大于默认值。此外,它还有一些没有文本的ImageButtons——如果您使用,您可能会提供一个图标,但还需要提供一个CharSequence作为描述——如果您将描述留空,仍然会为文本保留空间,如果您传递null,它将崩溃

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
有人能告诉我如何用自定义布局创建大通知吗

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png

感谢因API更改而更新:

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
从API 24开始,
Notification.Builder
包含-method。另外(它是support.v4包的一部分)包含此方法。
请注意,各州的文件:

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
提供自定义RemoteView,以代替扩展表单中的平台模板。这将覆盖扩展布局,否则该布局将由该生成器对象构建。在JELLY_BEAN之前的版本上没有操作

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
因此,这也只适用于API>=16(果冻豆)

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png

原始答案

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
所以在过度使用google之后,我发现了如何使用自定义大布局的解释。技巧不是使用
setStyle()
,而是在构建
通知后手动设置
通知的
bigContentView
字段。看起来有点老套,但这是我最后想到的:

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
通知\u layout\u big.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp" <!-- This is where I manually define the height -->
    android:orientation="horizontal" >

    <!-- some more elements.. --> 
</LinearLayout>
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
编辑
如chx101所述,这仅适用于API>=16的情况。我在回答中没有提到它,但在上面给出的链接教程中提到了它:

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
扩展通知最早是在Android 4.1 JellyBean[API 16]中引入的

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png
使用Kotlin生成自定义通知
对话框\自定义\通知

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_margin="@dimen/dp_10"
                        android:background="@drawable/shape_bg_main_notification"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:padding="@dimen/dp_10">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <ImageView
                                android:id="@+id/ivAppIcon"
                                android:layout_width="@dimen/dp_36"
                                android:layout_height="@dimen/dp_36"
                                android:layout_gravity="top"
                                android:background="@mipmap/ic_launcher" />
                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top"
                            android:layout_marginLeft="@dimen/dp_10"
                            android:layout_weight="1"
                            android:orientation="vertical">

                            <TextView
                                android:id="@+id/tvNotificationTitle"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text="Notification Tile"
                                android:textStyle="bold" />

                            <TextView
                                android:id="@+id/tvNotificationDescription"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="@dimen/dp_5"
                                android:text="Notification Description" />

                        </LinearLayout>

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="top">

                            <TextView
                                android:id="@+id/tvDateTime"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_alignParentRight="true"
                                android:layout_gravity="top"
                                android:text="09:50" />
                        </LinearLayout>
                    </LinearLayout>
                </LinearLayout>

        shape_bg_main_notification
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
            android:shape="rectangle">
            <solid android:color="@color/white" />

            <corners android:radius="@dimen/dp_6" />

        </shape>



        @SuppressLint("WrongConstant")
                    fun showOfflineNotification(context: Context, title: String, description: String) {
                        val NOTIFICATION_CHANNEL_ID = "com.myapp"
                        val intent = Intent(context, HomeActivity::class.java)
                        intent.putExtra("notification", 1)
                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
                        if (intent != null) {
                            val pendingIntent = PendingIntent.getActivity(
                                context, getTwoDigitRandomNo(), intent,
                                PendingIntent.FLAG_ONE_SHOT
                            )
                            val defaultSoundUri =
                                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

                            val remoteCollapsedViews = RemoteViews(packageName, R.layout.dialog_custom_notification)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationTitle, title)
                            remoteCollapsedViews.setTextViewText(R.id.tvNotificationDescription, description)
                            remoteCollapsedViews.setTextViewText(R.id.tvDateTime, getTime())

                            val notificationBuilder = NotificationCompat.Builder(context)
                            notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
                            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
                            notificationBuilder.setLargeIcon(
                                BitmapFactory.de

        codeResource(
                                        context.resources,
                                        R.mipmap.ic_launcher
                                    )
                                )
                                notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
                                notificationBuilder.setContentTitle(title)
                                if (description != null) {
                                    notificationBuilder.setContentText(description)
                                    notificationBuilder.setStyle(
                                        NotificationCompat.BigTextStyle().bigText(description)
                                    )
                                }
                                notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
                                notificationBuilder.setAutoCancel(true)
                                notificationBuilder.setSound(defaultSoundUri)
                                notificationBuilder.setVibrate(longArrayOf(1000, 1000))
                                notificationBuilder.setContentIntent(pendingIntent)

                                val notificationManager =
                                    context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                    val importance = NotificationManager.IMPORTANCE_MAX
                                    val notificationChannel = NotificationChannel(
                                        NOTIFICATION_CHANNEL_ID,
                                        "NOTIFICATION_CHANNEL_NAME",
                                        importance
                                    )
                                    notificationChannel.enableLights(true)
                                    notificationChannel.lightColor = Color.RED
                                    notificationChannel.enableVibration(true)
                                    notificationChannel.vibrationPattern = longArrayOf(1000, 1000)
                                    assert(notificationManager != null)
                                    notificationBuilder.setChannelId(NOTIFICATION_CHANNEL_ID)
                                    notificationManager.createNotificationChannel(notificationChannel)
                                }
                                notificationManager.notify(
                                    getTwoDigitRandomNo()/*Id of Notification*/,
                                    notificationBuilder.build()
                                )
                            }
                        }

                        private fun getTime(): String {
                            val calendar = Calendar.getInstance()
                            val mdformat = SimpleDateFormat("HH:mm")
                            val strDate = mdformat.format(calendar.time)
                            return strDate
                        }

                        fun getTwoDigitRandomNo(): Int {
                            return Random().nextInt(90) + 10
                        }



      [1]: https://me.stack.imgur.com/rQFP8.png


  [1]: https://me.stack.imgur.com/fKM9C.png

形状\u背景\u主\u通知
@SuppressLint(“错误常量”)
趣味showOfflineNotification(上下文:上下文,标题:字符串,描述:字符串){
val通知\u通道\u ID=“com.myapp”
val intent=intent(上下文,HomeActivity::class.java)
意向。额外(“通知”,1)
intent.addFlags(intent.FLAG\u活动\u清除\u顶部)
if(intent!=null){
val pendingent=pendingent.getActivity(
上下文,getTwoDigitRandomNo(),intent,
悬垂的帐篷,旗帜,一枪
)
val defaultSoundUri=
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_通知)
val remoteCollapsedViews=远程视图(packageName,R.layout.dialog\u custom\u通知)
remoteCollapsedViews.setTextViewText(R.id.tNotificationTitle,title)
remoteCollapsedViews.setTextViewText(R.id.tNotificationDescription,description)
remoteCollapsedViews.setTextViewText(R.id.tvDateTime,getTime())
val notificationBuilder=NotificationCompat.Builder(上下文)
notificationBuilder.setCustomBigContentView(remoteCollapsedViews)
notificationBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
notificationBuilder.setLargeIcon(
BitmapFactory.de
代码资源(
背景资源,
R.mipmap.ic_启动器
)
)
notificationBuilder.setBadgeIconType(R.mipmap.ic_launcher_round)
notificationBuilder.setContentTitle(标题)
if(说明!=null){
notificationBuilder.setContentText(说明)
notificationBuilder.setStyle(
NotificationCompat.BigTextStyle().bigText(说明)
)
}
notificationBuilder.setPriority(NotificationCompat.PRIORITY_HIGH)
notificationBuilder.setAutoCancel(真)
notificationBuilder.setSound(defaultSoundUri)
notificationBuilder.SetVibration(longArrayOf(10001000))
notificationBuilder.setContentIntent(挂起内容)
val通知经理=
作为NotificationManager的context.getSystemService(context.NOTIFICATION\u服务)
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
val重要性=NotificationManager.importance\u MAX
val notificationChannel=notificationChannel(