Android O - 单线通知 - 类似于" Android系统 - USB充电此设备"

时间:2018-06-04 08:57:36

标签: android android-notifications android-8.0-oreo

我希望我的ForegroundService有一个持续的通知,要求尽可能小的地方。我喜欢" Android系统 - USB为此设备充电"风格,但我找不到任何例子如何实现这一点。 enter image description here

有人能指出我正确的方向吗?

更新

如果为频道指定了重要性IMPORTANCE_MIN,则会向通知提供样式。

看起来没有办法使用内置样式的Androids来通知IMPORTANCE_MINForegroundService一起使用。

以下是IMPORTANCE_MIN

的说明
  

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

4 个答案:

答案 0 :(得分:4)

要显示紧凑的单行通知,例如收费通知,您必须创建一个优先级为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停止为止。

有一些图片(抱歉有些文字是西班牙语,但我认为图片仍然有用):

Single line ongoing notification

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

Single line ongoing notification opened

<强> EXTRA

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

看看这个:

Battery applications

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

Chennel notification for battery applications

并将重要性设置为LOW:

enter image description here

下次,这个&#34;电池消耗&#34;通知将显示为收费通知。

答案 1 :(得分:2)

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

以下是我如何做的示例。我已经包括创建完整的通知以供参考

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());

答案 2 :(得分:0)

要回答原始问题:

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

但是还是有希望的:)

Android P 上,NotificationChannelIMPORTANCE_LOW中优先级为PRIORITY_LOW 的通知是即使对于ForegroundService也压缩为一行。是的!

答案 3 :(得分:0)

我通过创建一个空的自定义视图来减小前台服务通知的大小:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


</LinearLayout>

然后创建这样的通知:

RemoteViews notifiactionCollapsed = new RemoteViews(getPackageName(),R.layout.notification_collapsed);
    Notification notification = new NotificationCompat.Builder(this,CHANNEL_ID)
            .setSmallIcon(R.drawable.eq_icon)
            .setCustomContentView(notifiactionCollapsed)
            .setStyle(new NotificationCompat.DecoratedCustomViewStyle())
            .setShowWhen(false)
            .setContentIntent(pendingIntent)
            .setPriority(NotificationCompat.PRIORITY_LOW)
            .setOngoing(true)
            .setVisibility(NotificationCompat.VISIBILITY_SECRET)
            .build();
    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
            notification);

这有助于减小通知的高度,但是我仍然不确定如何隐藏通知图标。