Android O – 单线通知 – 就像“Android系统 – USB充电此设备”

我想继续通知我的ForegroundService ,它需要尽可能小的地方。 我喜欢“Android系统 – USB充电这个设备”的风格,但我找不到任何如何实现这个的例子。 在此处输入图像描述

谁能指出我正确的方向?

更新

如果为通道分配了重要性IMPORTANCE_MIN则会为通知指定样式。

看起来没有办法使用内置样式的Androids来将IMPORTANCE_MIN通知与ForegroundService一起使用。

以下是IMPORTANCE_MIN的说明:

最小通知重要性:仅在阴影下方显示。 这不应该与Service.startForeground一起使用,因为前台服务应该是用户关心的东西,因此将其通知标记为最低重要性并不具有语义意义。 如果您从Android版本Build.VERSION_CODES.O开始执行此操作,系统将显示有关您的应用在后台运行的更高优先级通知。

要显示紧凑的单行通知(如收费通知),您必须创建优先级为IMPORTANCE_MIN的Notification Channel

 @TargetApi(Build.VERSION_CODES.O) private static void createFgServiceChannel(Context context) { NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_MIN); NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.createNotificationChannel(channel); } 

然后创建一个持续的通知:

 public static Notification getServiceNotification(Context context) { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, "channel_id"); mBuilder.setContentTitle("One line text"); mBuilder.setSmallIcon(R.drawable.ic_notification); mBuilder.setProgress(0, 0, true); mBuilder.setOngoing(true); return mBuilder.build(); } 

注意

请注意,我已经使用IntentService而不是Service进行了测试,它可以正常运行。 此外,我刚刚检查了设置一个15秒的Thread.sleep()并且通知完全显示,直到IntentService停止。

有一些图像(抱歉一些文本是西class牙语,但我认为图像仍然有用):

单行持续通知

如果您向下拖动并打开通知,则显示如下:

单线持续通知已打开

额外

如果您发现Android系统显示通知,指示所有使用电池的应用程序(具有持续服务的应用程序),您可以降级此类通知的优先级,它将显示为一行通知,如收费通知。

看看这个:

电池应用

只需长按此通知,然后选择所有类别:

Chennel通知电池应用

并将重要性设置为LOW:

在此处输入图像描述

下次,此“电池消耗”通知将显示为充电通知。

您需要将通知优先级设置为Min,将Notification Channel重要性设置为Min,并禁用显示Notification Channel Badge。

这是我如何做的一个例子。 我已经包括创建完整的通知以供参考

 private static final int MYAPP_NOTIFICATION_ID= -793531; NotificationManager notificationManager = (NotificationManager) context .getSystemService(Context.NOTIFICATION_SERVICE); String CHANNEL_ID = "myapp_ongoing"; CharSequence name = context.getString(R.string.channel_name_ongoing); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN); channel.setShowBadge(false); notificationManager.createNotificationChannel(channel); } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_stat_notification_add_reminder) .setContentTitle(context.getString(R.string.app_name)) .setContentText(context.getString(R.string.create_new)) .setOngoing(true).setWhen(0) .setChannelId(CHANNEL_ID) .setPriority(NotificationCompat.PRIORITY_MIN); // Creates an intent for clicking on notification Intent resultIntent = new Intent(context, MyActivity.class); ... // The stack builder object will contain an artificial back stack // for the // started Activity. // This ensures that navigating backward from the Activity leads out // of // your application to the Home screen. TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); // Adds the back stack for the Intent (but not the Intent itself) stackBuilder.addParentStack(MyActivity.class); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); notificationManager.notify(MYAPP_NOTIFICATION_ID, mBuilder.build()); 

可扩展的通知

默认情况下,通知的文本内容会被截断以适合一行。 如果您希望通知更长,则可以通过应用其他模板启用可扩展的更大文本区域。

此外,Android 4.1支持可扩展通知。 除了普通的通知视图外,还可以定义一个大视图,该视图在扩展通知时显示。 大视图有三种风格:大图片风格,大文字风格,收件箱风格。 下面的代码演示了BigTextStyle()的用法,它允许使用高达256 dp。

例如 :

 String longText = "..."; Notification noti = new Notification.Builder(this) ..... ..... ..... .setStyle(new Notification.BigTextStyle().bigText(longText)) 

回答原始问题:

在Android O上似乎没有内置的方法来获得单行,正在进行ForegroundService通知。 人们可以尝试添加自定义设计,但由于不同的手机具有不同的通知设计,因此该解决方案并不是一个好的解决方案。

但是有希望:)

Android P上 ,优先级为PRIORITY_LOWIMPORTANCE_LOWNotificationChannel中的NotificationChannel即使对于ForegroundService也会压缩为单行。 是啊!

试试这个,我以前一直在使用应用程序。

  import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.support.v7.app.NotificationCompat; import android.util.Log; import java.lang.reflect.Method; public static Notification getForegroundNotification(Context context) { Notification notification = new NotificationCompat.Builder(context) .setContentTitle(context.getString(R.string.app_name)) .setContentText("Notification text") .setAutoCancel(false) .setPriority(Notification.PRIORITY_MAX) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher)) .setOngoing(true) .build(); return notification; }