我正在为这个问题寻找一个月以来的合适解决方案,但stack overflow
上除了Is Notification.Builder setTicker still useful in Android 5 and above?之外,我可以从中学习。我也在这里尝试过许多线程及其答案。但是现在我想我必须在这里提出我的问题。因为我的应用程序处于部署阶段。
我正在后台运行一项服务,该服务向用户显示多个通知。 onStartCommand
有runnable thread
在Thread.sleep(10000);
睡眠后继续为特定事件运行,如果已经显示通知,则我不会通过分配Boolean variables for each notifications to true
并再次检查来再次显示需要显示通知的变量。一切都像我想要的那样完美...... !! :)
这是建立和显示通知的方式:
mNotifyManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this, null);
mBuilder.setContentTitle("Insta Promo")
.setContentText("Get details here..")
.setTicker("Get details here..")
.setSmallIcon(R.drawable.ic_service_success)
.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND)
.setPriority(Notification.DEFAULT_ALL)
.setAutoCancel(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_HIGH);
// Configure the notification channel.
notificationChannel.setDescription("Channel description");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
notificationChannel.enableVibration(true);
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
mNotifyManager.createNotificationChannel(notificationChannel);
}
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
startForeground(1, mBuilder.build());
这是以后通知显示的方式:
if (!Notif_One)
{
Notif_One = true;
mBuilder.setContentText("ERROR, UNINSTALL APP..");
mBuilder.setTicker("ERROR, UNINSTALL APP..");
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
startForeground(1, mBuilder.build());
}
什么是问题:
Below Lollipop
它显示动画的自动收报机,默认声音和默认振动..所有OKAY。Lollipop
Marshmallow
和Nougat
未显示任何动画片段文字.. !! Oreo
弹出美丽的抬头通知,然后自动弹出/隐藏它。我知道在Lollipop
需要Notification.PRIORITY_HIGH
和Vibrate
以上的提醒通知工作......,如果我进行了此类更改,那么其行为就像:
Below Lollipop
它显示动画的自动收报机,默认声音和默认振动..所有OKAY。Lollipop
Marshmallow
和Nougat
弹出通知,但不会再次自动将其隐藏到状态栏中。我该如何让它自动隐藏或显示古老美丽的动画自动收报机通知文本。Oreo
弹出美丽的抬头通知,然后自动弹出/隐藏它。我希望我已经提出了一个非常简洁的问题,这个问题不重复,这符合所有论坛规则,对于运行foreground service.
many notifications
的许多用户来说,这对于stackoverflow非常重要。
提前感谢stackoverflow和开发人员。
答案 0 :(得分:0)
好吧,我已经解决了这个问题,我认为在显示来自前台服务的通知时遇到同样问题的其他人会有所帮助。
我声明的服务类变量是
NotificationManager mNotifyManager;
NotificationCompat.Builder mBuilder;
NotificationChannel notificationChannel;
String NOTIFICATION_CHANNEL_ID = "17";
我的服务类onCreate()
正在发出第一个通知
try
{
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
mNotifyManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this, null);
mBuilder.setContentTitle("Insta Promo")
.setContentText("Get details here..")
.setTicker("Get details here..")
.setSmallIcon(R.drawable.ic_service_success)
.setPriority(Notification.PRIORITY_HIGH)
.setDefaults(Notification.DEFAULT_ALL)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_HIGH);
// Configure the notification channel.
notificationChannel.setDescription("Channel description");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
notificationChannel.enableVibration(true);
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
mNotifyManager.createNotificationChannel(notificationChannel);
}
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
startForeground(17, mBuilder.build());
}
catch(Exception e)
{
Log.d("xx", "EXCEPTION IN SHOWING NOTIFICATION...\n");
Log.e("xx", "Exception is : ", e);
}
此后每当我需要用另一个
替换现有通知时mBuilder.setContentText("PLEASE ALLOW PERMISSIONS...");
mBuilder.setTicker("PLEASE ALLOW PERMISSIONS...");
mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
startForeground(17, mBuilder.build());
如果您想停止前台服务但是保留通知
stopForeground(false);
并且不要致电stopself()
而不是主要活动OnDestroy
停止此服务并清除通知渠道
希望它可以帮助某人:)