public final class NotificationUtil {private static final String CHANNEL_ONE_ID = "myapp_name"; //唯一性private static final int NOTIFY_ID = 0x111;private static final int FOREGROUND_ID = 0x112;/*** 公开使用*/@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public static void sendNotification(Context context, String channelName, String channelDesc, String contentTitle, String contentText) {NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {manager.notify(NOTIFY_ID, getNotificationO(context, manager, channelName, channelDesc, contentTitle, contentText));} else {manager.notify(NOTIFY_ID, getNotification(context, contentTitle, contentText));}}/*** onStartCommand调用*/@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public static void startForeground(Service service, String channelName, String channelDesc, String contentTitle, String contentText) {NotificationManager manager = (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE);Notification notification;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {notification = getNotificationO(service, manager, channelName, channelDesc, contentTitle, contentText);} else {notification = getNotification(service, contentTitle, contentText);}notification.flags = Notification.FLAG_ONGOING_EVENT;notification.flags |= Notification.FLAG_NO_CLEAR;notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;service.startForeground(FOREGROUND_ID, notification);}/*** onDestory之前调用*/public static void stopForegound(Service service) {service.stopForeground(true);}@RequiresApi(api = Build.VERSION_CODES.O)private static Notification getNotificationO(Context context, NotificationManager manager, String name, String desc, String contentTitle, String contentText) {Notification.Builder builder;NotificationChannel channel = new NotificationChannel(CHANNEL_ONE_ID, name,NotificationManager.IMPORTANCE_DEFAULT);channel.setDescription(desc);//channel.enableLights(true);//channel.setLightColor(color);//Uri mUri = Settings.System.DEFAULT_NOTIFICATION_URI;//channel.setSound(mUri, Notification.AUDIO_ATTRIBUTES_DEFAULT);// Register the channel with system; you can't change the importance// or other notification behaviors after thismanager.createNotificationChannel(channel);builder = new Notification.Builder(context, CHANNEL_ONE_ID);builder.setCategory(Notification.CATEGORY_RECOMMENDATION).setContentTitle(contentTitle).setContentText(contentText)//.setContentIntent(getPendingIntent(context)).setSmallIcon(android.R.drawable.ic_notification_overlay); //todoreturn builder.build();}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private static Notification getNotification(Context context, String contentTitle, String contentText) {Notification.Builder builder = new Notification.Builder(context).setPriority(Notification.PRIORITY_DEFAULT)//.setLights(color, 1000, 0)//.setSound(null, null);;builder.setCategory(Notification.CATEGORY_RECOMMENDATION).setContentTitle(contentTitle).setContentText(contentText)//.setContentIntent(getPendingIntent(context)).setSmallIcon(android.R.drawable.ic_notification_overlay); //todoreturn builder.build();}//    private static PendingIntent getPendingIntent(Context context) {//        Intent intent = new Intent(context, MainActivity.class);
//        intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
//        PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//        return pi;
//    }}

在activity中直接调用startService还是能跑的。只有当activity被认定为后台进程了。但是由于不确定性,所以只能使用startForegroundService来处理。

引用自:https://www.jianshu.com/p/f2db0f58d47f
startService抛异常不是看调用的APP处于何种状态,而是看Servic所在APP处于何种状态,因为看的是UID的状态,所以这里重要的是APP而不仅仅是进程状态
不要通过Handler延迟太久再startService,否则可能会有问题
应用进入后台,60s之后就会变成idle状态,无法start其中的Service,但是可以通过startForegroundService来启动
Application里面不要startService,否则恢复的时候可能有问题
startForegoundService() 要及时配合startForeground(),否则会有各种异常。

android o适配foregroundService和notification相关推荐

  1. Android 8.0+通知栏(Notification)适配详解,判断通知权限是否打开,并跳转至通知管理页面

    前不久因为API26(Android 8.0)以上的设备无法显示通知栏,所以网上查阅了比较多了资料,得出结论,API26以后引入了通知渠道这么个东西,然后就写了一篇问题对应的博文:Android 8. ...

  2. Android 10 适配攻略

    相比较去年的写的Android 9适配,这次Android 10的内容有点多.没想到写了我整整两天,吐血中... 准备工作 老规矩,首先将我们项目中的targetSdkVersion改为 29. 1. ...

  3. android notification 定时显示,Android编程使用Service实现Notification定时发送功能示例...

    本文实例讲述了android编程使用service实现notification定时发送功能.分享给大家供大家参考,具体如下: /** * 通过启动或停止服务来管理通知功能 * * @descripti ...

  4. Android开发学习之路--Notification之初体验

    一般当我们收到短信啊,微信啊,或者有些app的提醒.我们都会在通知栏收到一天简单的消息,然后点击消息进入到app里面,事实上android中有专门的Notification的类能够完毕这个工作,这里就 ...

  5. 鸿洋android屏幕适配四部曲-传送门

    鸿洋android屏幕适配四部曲-传送门 两分钟理解Android中PX.DP.SP的区别 https://blog.csdn.net/donkor_/article/details/77680042 ...

  6. Android 屏幕适配

    一.适配方式之dp 名词解释 分辨率:480*800,1280*720.表示物理屏幕区域内像素点的总和.(切记:跟屏幕适配没有任何关系) 因为我们既可以把1280*720 的分辨率做到4.0 的手机上 ...

  7. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  8. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  9. android 布局适配虚拟键适配

    今天,看到关于虚拟键盘的内容,于是记录一下. 如果是控件,可以直接使用Android:fitsSystemWindows="true"),但是如果是popwindow,那就必须获取 ...

最新文章

  1. 周围剃光头顶留长发型_2021年发型预测:这5位中长发男神,谁才是你心中的长发代表...
  2. 【c语言】蓝桥杯算法训练 薪水计算
  3. 已解决:大家使用原子哥的延时函数delay_ms,delay_us会出现进入延时函数出不来的情况
  4. ES6减少魔法操作之Reflect
  5. jQuery 1.11 / 2.1 beta 版发布
  6. 网页现现实理服务器没有响应,前端_网页编程 HTTP协议(进阶)
  7. linux设置r镜像,一劳永逸,R的个性化默认配置
  8. 压缩软件能否加上忽略某些目录的功能
  9. Requests 高级用法 —2.18.1 文档
  10. 好用的Redis客户端操作工具
  11. c++静态成员变量和静态成员方法
  12. [转]caffe源码解析 — caffe.proto
  13. 乔伊·伯纳尔(Joey Bernal)的评论专栏,社交网络的三阶段路线图
  14. jmeter 录制--https代理证书导入IOS手机
  15. 用python开发的运维管理系统_python运维开发常用模块(一)psutil
  16. 前端集成解决方案(webpack、gulp)
  17. zoj2587 Marlon's String
  18. WPF-Interaction.Triggers
  19. Agg在Windows下的编译与使用
  20. tinymce 字体样式_谷歌字体和TinyMCE

热门文章

  1. openoffice osl模块学习1
  2. openssl实现私有CA
  3. 哈罗单车完成7亿美金融资;京东考虑CDR形式回A股;QQ将停止为欧洲用户提供服务丨价值早报
  4. asp.net使用html表单,ASP.NET Web Pages
  5. 程序员的成长故事之 从微软走向开源的5年
  6. 聚宽数据python_利用聚宽(Joinquant)数据源为vnpy添加期货行情数据
  7. 覆盖率系列学习之功能覆盖率
  8. ASP.NET入门随想之吸星大法
  9. Rive动画使用介绍(Flutter)
  10. matlab白噪声频谱分析,matlab软件进行光谱频谱分析的方法