我希望我的ForegroundService
有一个持续的通知,要求尽可能小的地方。我喜欢" Android系统 - USB为此设备充电"风格,但我找不到任何例子如何实现这一点。
有人能指出我正确的方向吗?
如果为频道指定了重要性IMPORTANCE_MIN
,则会向通知提供样式。
看起来没有办法使用内置样式的Androids来通知IMPORTANCE_MIN
与ForegroundService
一起使用。
以下是IMPORTANCE_MIN
:
最小通知重要性:仅在阴影下方显示。这不应该与Service.startForeground一起使用,因为前台服务应该是用户关心的东西,因此将其通知标记为最低重要性并不具有语义意义。如果您从Android版本Build.VERSION_CODES.O开始执行此操作,系统将显示有关您的应用在后台运行的优先级较高的通知。
答案 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
停止为止。
有一些图片(抱歉有些文字是西班牙语,但我认为图片仍然有用):
如果您向下拖动并打开通知,则显示如下:
<强> EXTRA 强>
如果您发现Android系统会显示通知,指示所有正在使用电池的应用(具有持续服务的应用),您可以降级此类通知的优先级,它会显示为一行通知,例如收费通知。< / p>
看看这个:
只需长按此通知,然后选择所有类别:
并将重要性设置为LOW:
下次,这个&#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 上,NotificationChannel
中IMPORTANCE_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);
这有助于减小通知的高度,但是我仍然不确定如何隐藏通知图标。