Service组件在android开发中经常遇到,其经常作为后台服务,需要始终保持运行,负责处理一些必要(见不得人)的任务。而一些安全软件,如360等,会有结束进程的功能,如果不做Service的保持,就会被其杀掉。

在早些时候,我们可以通过在

1. service中重写onStartCommand方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动

public int onStartCommand(Intent intent, int flags, int startId) {

return START_STICKY;

}

2. 配置android:persistent="true"

3. setForeground(true);

4. android:process=”com.xxx.xxxservice”配置到单独的进程中

以上的方法要么只是提升service优先级或者存活率, 并不能解决被安全软件强行杀死的问题.

要么像第四种单独的进程运行service在360老的版本是可以的,但是在360的比较新的版本中仍然会被杀死.

如何保持Service的运行状态是现在要说明的,核心就是利用ANDROID的系统广播,触发自己的程序检查Service的运行状态,如果被杀掉,就再起来。

常用的有开机广播,解锁屏幕的广播,电量变化等等, 其中解屏的广播算比较频繁的了,但是也并不能保证一定的频率,尤其是在特定的时间里(比如用户睡觉的时候,用户并不进行解锁操作).而我们仍要做一些操作的时候,就没有办法了.

因此,我采用了一种别的方案. 另外再加上两个类似一守护进程的Service, 分别检查Service的运行状态,注册响应的广播,对其进行守护,一旦发现没有运行就将其启动.

我利用的系统广播是

Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。

它的优点就是间隔时间短而且非常稳定, 而其他的广播并不能保证这一点,当然,在具体的应用中还是要根据需求使用, 结合其他广播来保证自己的service一定会被重启.

毕竟现在安全软件是越来越厉害了,更新得也是非常频繁. 有时间还是要看下还有没有其他的方法,综合几种来使用.

下边就是具体的代码和注意事项了:

1、 Intent.ACTION_TIME_TICK的使用

我们知道广播的注册有静态注册和动态注册,但此系统广播只能通过动态注册的方式使用。即你不能通过在manifest.xml里注册的方式接收到这个广播,只能在代码里通过

registerReceiver()方法注册。

在ThisApp extends Application 或者在service里注册广播:

[java] view plaincopy
  1. IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK);
  2. MyBroadcastReceiver receiver = new MyBroadcastReceiver();
  3. registerReceiver(receiver, filter);

在广播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里

[java] view plaincopy
  1. boolean isServiceRunning = false;
  2. if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) {
  3. //检查Service状态
  4. ActivityManager manager = (ActivityManager)AppApplication.getContext().getSystemService(Context.ACTIVITY_SERVICE);
  5. for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) {
  6. if("so.xxxx.xxxxService".equals(service.service.getClassName()))
  7. {
  8. isServiceRunning = true;
  9. }
  10. }
  11. if (!isServiceRunning) {
  12. Intent i = new Intent(context, xxxService.class);
  13. context.startService(i);
  14. }
  15. }

终极解决方案: 使用Kni,在 c端 fork进程,检测Service是否存活,若Service已被杀死,则进行重启Service.   至于检测方式,可以轮询获取子进程Pid,若为1, 则说明子进程被Init进程所领养,已经成为了孤儿进程.    但是这种方式比较消耗电量,并且由于不同手机系统定制的改变,当应用被强制停止时,父进程并不一定被真正杀死,因此在一些特定机型上是无法通过此方式进行判断. 这里推荐使用liunx socket的方式进行类似心跳包的检测,并且当触发检测Service是否被杀死之前,需要判断应用是否已经被卸载,如果应用已经被卸载,则不再进行检测Service行为,直接调用exit(0)退出子进程,避免浪费系统资源和消耗电量.

android守护进程相关推荐

  1. android守护进程详解

    本文参考"腾讯Bugly(http://bugly.qq.com)" Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被杀死的概率 B. 在进程被杀死后,进行 ...

  2. linux怎么监控守护进程,linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

  3. 守护进程通信之Socket

    前置文章 <创建Android守护进程(底层服务) > 前言 在文章 <创建Android守护进程(底层服务) > 中,学习了如何创建一个 Android 守护进程,但是这个进 ...

  4. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路(1)

    上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学习计划简要介绍了Android系统进程间通信机制Binder的总体架构,它由Client.Server.Service Mana ...

  5. android双进程守护耗电,Android实现双进程守护

    做过android开发的人应该都知道应用会在系统资源匮乏的情况下被系统杀死!当后台的应用被系统回收之后,如何重新恢复它呢?网上对此问题有很多的讨论.这里先总结一下网上流传的各种解决方案,看看这些办法是 ...

  6. android 8 ril,Android系统启动——8 附录2:相关守护进程简介

    本次系列的内容如下: 在init.rc中定义了很多系统的守护进程,这里主要是做一些简单的介绍 一.uevent 负责相应uevent事件,创建设备节点文件: 代码在init.rc 550行 550se ...

  7. Android 系统(271)---进程、守护进程的实现及进程拉活

    进程.守护进程的实现及进程拉活 1,概念 1)守护进程(Daemon) 是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某些任务.android中守护进程的实现主要由Service来完成. ...

  8. Android 系统内的守护进程 - main类服务(1) : netd

    声明 工作需要,分析netd 其实很好奇Android系统中的一些关键守护进程服务的作用: 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客: ...

  9. Android 系统内的守护进程 - core类中的服务 (5) : logd

    声明 工作需要,分析logd 其实很好奇Android系统中的一些关键守护进程服务的作用: 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客: ...

  10. Android 通过JNI实现守护进程

    转载请注明出处:http://blog.csdn.net/yyh352091626/article/details/50542554 开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国 ...

最新文章

  1. 表弟高考650多,程序员不建议学计算机,亲戚:你不希望别人好
  2. 分段路由:一个新的SDN内部技术—Vecloud
  3. LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]
  4. SpringBoot同时集成Redis和Guava作为缓存组件--进一步分析代码
  5. UNICODE与UTF-8的转换
  6. Redis数据分布一致性哈希
  7. 200多个js技巧代码(五)
  8. Linux编程(3)_vim的使用
  9. 光模块价格由带宽还是距离决定_5G光模块市场:行“提量降本”之道 走“技术深耕”之途...
  10. 智能电视主流的CPU有三家。一个是Mstar(晨星),另两个是MTK和Amlogic(晶晨)
  11. vba formula 公式的引用
  12. 什么是管理者的有用功
  13. sap固定资产号码范围_SAP 固定资产的配置与逻辑
  14. 百度AI Studio飞桨平台 “深度学习”结课总结
  15. 多彩的书写工具,画图写字更好看,米家液晶小黑板多彩版上手
  16. 低功耗设计及其UPF实现第四节(最后一节)
  17. 【软考】【计算机网络】OSI/RM模型及相应硬件
  18. 工信部叫停苹果 Callkit,微信不能直接接听视频了
  19. 2020中国游戏公司财报分析《笔记》
  20. 非暴力沟通——读后感

热门文章

  1. spark sql python_Spark 3.0开发近两年终于发布,流、Python、SQL重大更新详解
  2. html内容超出不自动滚动,16.css: overflow使用 例: 固定div大小,不让内容超出div
  3. js 中添加php数组,浅谈javascript中数组Array的添加/删除操作
  4. c++ 一个函数包括多个返回值判断_整活函数式编程
  5. python设置很大的刻度_【Matplotlib】设置刻度(1)
  6. linux常用命令V1.1
  7. linux web目录安全设置,[LNMP]Linux的Web环境的安全配置
  8. 联合哈佛大学,Google 要用人工智能来预测地震余震
  9. 遗传算法的基本概念和实现(附 Java 实现案例)
  10. Android--sharepreference总结