前言

前面写了一个脚本 来执行自动打卡 效果还不错
又学习了一些android的体系知识点

其中就用到了前台服务 利用播放器的模式 来消除被杀的可能
提高Service的优先级

如何保活Service

1. 提高Service的优先级:

为防止Service被系统回收,可以尝试通过提高服务的优先级解决,
1000是最高优先级,数字越小,优先级越低
android:priority=“1000”

2.把service写成系统服务

在Manifest.xml文件中设置persistent属性为true,则可使该服务免受out-of-memory killer的影响。
但是这种做法一定要谨慎,系统服务太多将严重影响系统的整体运行效率。

3.将服务改成前台服务foreground service:

重写onStartCommand方法,使用StartForeground(int,Notification)方法来启动service。
注:一般前台服务会在状态栏显示一个通知,最典型的应用就是音乐播放器,只要在播放状态下,
就算休眠也不会被杀,如果不想显示通知,只要把参数里的int设为0即可。
同时,对于通过startForeground启动的service,
onDestory方法中需要通过stopForeground(true)来取消前台运行状态。

4.利用Android的系统广播

利用ANDROID的系统广播检查Service的运行状态,如果被杀掉,就再起来,系统广播是Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。

分析为何后台服务会被回收?

当后台服务被回收的时候,我们查看Logcat里面的日志的时候,我们可能会看到如下的日志

Killing ProcessRecord{43a96570 6437:com.example.helloandroid/u0a187}: background ANR
Process com.example.helloandroid (pid 6437) (adj 0) has died.

看日志说明是ANR导致的,如何避免ANR呢?

1.主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
2.BroadcastReceiver 没有在10秒内完成返回
3.在主线程内进行网络操作
4.在主线程内进行一些缓慢的磁盘操作(I/O操作或数据库操作)
至于如何避免ANR的发生,各位尽量避免上面这几种情况出现,基本上就能避开大部分ANR了。

Foreground Service(前台服务)

前台服务是那些被认为用户知道(用户所认可的)且在系统内存不足的时候不允许系统杀死的服务。前台服务必须给状态栏提供一个通知,它被放到正在运行(Ongoing)标题之下——这就意味着通知只有在这个服务被终止或从前台主动移除通知后才能被解除。


在一般情况下,Service几乎都是在后台运行,一直默默地做着辛苦的工作。但这种情况下,后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收。
那么,如果我们希望Service可以一直保持运行状态且不会在内存不足的情况下被回收时,可以选择将需要保持运行的Service设置为前台服务。


照做音乐播放器的思路,做一下相关的说明,如何使用前台服务

public class MusicPlayerService extends Service {private static final String TAG = MusicPlayerService.class.getSimpleName();@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "onCreate()");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "onStartCommand()");}@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "onBind()");// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}
}

然后创建Notification:

在Service的onStartCommand中添加如下代码:

@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e(TAG, "-------------onStartCommand");Context context = this;NotificationCompat.Builder builder = new NotificationCompat.Builder(context);builder.setSmallIcon(R.mipmap.timer_task);builder.setContentTitle("新消息").setContentText("这是一条定时任务");builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.timer_task));// 8.0设置Notification的Channel_ID,否则不能正常显示if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {builder.setChannelId("notification_id");}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);NotificationChannel channel = new NotificationChannel("notification_id", "notification_name", NotificationManager.IMPORTANCE_LOW);assert notificationManager != null;notificationManager.createNotificationChannel(channel);}//启用前台服务 其目的是为了保活 提高Service的优先级startForeground(0, builder.build());}

在完成Notification通知消息的构建后,
在Service的onStartCommand中可以使用startForeground方法来让Android服务运行在前台。

如果需要停止前台服务,可以使用stopForeground来停止正在运行的前台服务。

 @Overridepublic void onDestroy() {  //停止服务stopForeground(true);super.onDestroy();Log.e(TAG, "-------------onDestroy");}

总结

前台服务与普通服务的区别?

1.前台Service的系统优先级更高、不易被回收;
2.前台Service会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。

Android Service前台服务 StartForeground相关推荐

  1. Android Foreground Service (前台服务)-by:nixs

    一.如何保活后台服务 在Android Services (后台服务) 里面,我们了解了Android四大组件之一的Service,知道如何使用后台服务进行来完成一些特定的任务.但是后台服务在系统内存 ...

  2. android Foreground Service 前台服务/notification全局通知

    android Foreground Service 前台服务/notification全局通知 前言 要素简介 前台服务(Foreground Service) 全局通知(notification) ...

  3. Foreground Service前台服务

    Foreground Service前台服务 介绍前台服务 模拟播放器前台服务发送通知 介绍前台服务 前台服务是那些被认为用户知道(用户所认可的)且在系统内存不足的时候不允许系统杀死的服务.前台服务必 ...

  4. android q启动前台服务,Android 启动前台服务,适配 vivo 与 OPPO 手机,第一期

    Android 启动前台服务,华为.小米.三星.OPPO.VIVO的配合程度接 这是前文链接,我先甩在这里,上篇文章主要分析了几种品牌手机关于通知的配合程度,这篇文章先写第一期的解决方案,毕竟需求还是 ...

  5. 前台服务 StartForeground

    一.如何保活后台服务 在Android Services (后台服务) 里面,我们了解了Android四大组件之一的Service,知道如何使用后台服务进行来完成一些特定的任务.但是后台服务在系统内存 ...

  6. android开启前台服务_Android 知识点必知之ANR与OOM

    ANR ANR 简介 ANR 全称 (Application Not responding):指的是应用程序未响应,Android 系统对于事件的处理需要在一定时间内完成,如果超过该时间没有得到响应, ...

  7. android service前台服务器,Android网络前台向服务端页面请求数据

    这是一个android前台向服务端网站请求少量数据的小例子. 首先设计好服务端,再来写安卓前端. 一:服务端 新建动态网站,在java包下新建一个类继承HttpServlet父类,重写doGet()方 ...

  8. Service前台服务

    让服务以notification的形式,显示在前台,不容易被杀死 只需在Service的inCreate里面,构建notification,不是用NotificationManager启动,而是用st ...

  9. android开启前台服务_如何在PC端一次性开启Tasker的所有权限和服务

    Tasker需要开启很多服务和获取很多权限 通过下面的命令可以详细获取Tasker相关的权限和服务 adb shell dumpsys package net.dinglisch.android.ta ...

最新文章

  1. camera数字降噪(DNR)
  2. 2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
  3. docker部署Javaweb环境数据库连接问题
  4. Portal-Basic Java Web 应用开发框架:应用篇(十三) —— REST Convention
  5. struts中文问题,struts国际化问题的终极解决方案
  6. 1622C. Set or Decrease
  7. Linux连接状态为syn_recv,linux 服务器 syn*** 大量SYN_RECV状态处理
  8. Pyomo 优化建模
  9. Memcached在Windows下的安装
  10. Dubbo源码分析(一)Dubbo与Spring集成实例
  11. flowable 查询完成的流程_中注协正在调试注册会计师成绩查询系统?
  12. SecureCRT在linux与windows本地互传文件之SFTP
  13. 恢复出厂设置 卡住10分钟问题
  14. 存储器容量相关概念及计算
  15. 公司专利技术交底书撰写及申请完全流程
  16. 范浩强平衡树(FHQ_Treap)介绍
  17. 淘宝标题优化技巧有哪些禁区注意事项
  18. 人脸识别2:InsightFace实现人脸识别Face Recognition(含源码下载)
  19. 四位顶级AI大牛纵论:深度学习和大数据结合的红利还能持续多久?
  20. 亚马逊美国站12岁以下儿童产品 CPSIA测试标准

热门文章

  1. JavaWeb:JSP 和 JSTL
  2. java hive建表_java jdbc 操作 hive 建表 load 数据
  3. 神经网络硕士就业前景,图神经网络前景如何
  4. oracle 中用户 授权,Oracle grant用户授权
  5. nginx配置https以及websocket
  6. 科研日记8.19 两头镀金光纤
  7. 在maven项目中使用jstl无法输出值
  8. Easyui中input标签设置只读
  9. 成功解决:Oracle中文乱码问题(很详细,很详细,很详细)
  10. html鼠标在图片上显示文字说明,鼠标路过图片,出现说明文字,是怎么做的?...