转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52779986

守护进程是一个黑色地带的产物,无论是通过native的方式在linux中fork进程达到,还是在java层通过两个service守护的方式,都是不太友好的做法,据很多人反应,总有一些实际的业务场景中,希望自己的应用保持live状态,
一种是在native中做:

  • linux中多进程;
  • unix domain套接字实现跨进程通信;
  • linux的信号处理;
  • exec函数族的用法;

把他们组合起来实现了一个双进程守护,几个实现双进程守护时的关键点:

1.父进程如何监视到子进程(监视进程)的死亡?

  • 很简单,在linux中,子进程被终止时,会向父进程发送SIG_CHLD信号,于是我们可以安装信号处理函数,并在此信号处理函数中重新启动创建监视进程;

2.子进程(监视进程)如何监视到父进程死亡?

  • 当父进程死亡以后,子进程就成为了孤儿进程由Init进程领养,于是我们可以在一个循环中读取子进程的父进程PID,当变为1就说明其父进程已经死亡,于是可以重启父进程。这里因为采用了循环,所以就引出了之前提到的耗电量的问题。

3.父子进程间的通信

  • 有一种办法是父子进程间建立通信通道,然后通过监视此通道来感知对方的存在,这样不会存在之前提到的耗电量的问题,在本文的实现中,为了简单,还是采用了轮询父进程PID的办法,但是还是留出了父子进程的通信通道,虽然暂时没有用到,但可备不时之需!

这种native方式,可参考链接:
http://dearseven.blog.163.com/blog/static/100537922201523143957103/

今天介绍下用两个service守护的方式作一完整的小案例。仅作学习交流之用。两个进程互相监视对方,发现对方挂掉就立刻重启!(实际就是在onDisconnected时,start另一个service)

假设我们的APP中开启了两个Service,分别是A和B,那么:
如果A守护B,则B挂掉的同时,A就应该把B唤醒起来,反之亦然,也就是说A和B应该是互相守护,无论谁被杀掉,对方就把它唤醒起来。
既然提到了两个Service,那么这两个Service就不能让它们同处在一个进程中,否则就会被一次性双杀。显然不能在同一个进程中,在Android中通常我们可以使用AIDL来实现IPC实现。

原理图(简单版):

ServiceA.Java


ServiceB.Java


MainActivity.java

Manifest.xml

IBridgeInterface.aidl

效果图:

最后:如果系统干掉这个服务,还是难逃此劫的。向ROM厂商提出加白名单方式,才是终极最万全方案。
以上完整代码下载链接:https://github.com/hejunlin2013/MultiMediaSample

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

APP中一种在Java层实现的简单守护进程方式相关推荐

  1. 搜狗微信APP逆向(一)java层

    在该app可以搜索关键词,选择微信后面的赛选进行排序: 发现如下加密参数: 未发现加固加壳方式: 我们直接搜索定位: package com.sogou.utils; 我们先hook下这个a方法看下传 ...

  2. java join 异常_Java:守护进程:thread.join()没有完成,当在一个线程中抛出异常时...

    我写了一个Java守护进程(一个实现守护进程和Runnable的类),现在我遇到了以下问题: 在init()中,我创建了一个新线程 . Thread thread = new Thread(this) ...

  3. 守护进程方式保证App不被杀死

    思路 linux进程中用到的方法 代码 1 linux进程部分 2 App部分 3 Androidmk部分 转载请注明链接 因为Android的内存管理机制,当系统内存紧张时,App如果运行在后台,容 ...

  4. 使用struts2框架中3种客户端向服务端发送请求参数的方式

    1.action属性: 前端参数直接在action属性名之后,如PersonAction?id=1; 在对应的action中加入属性id,必须加对应属性的get(),set()方法,其中属性名应为小写 ...

  5. android 6.0 自定义application,Android6.0之App中的资源管理对象创建

    Android与资源管理相关的类Resouces和AssetManager很有必要清楚他们的创建过程. 与资源查找与加载操作相关的类 资源查找与加载主要是靠Android资源管理框架来完成的,而And ...

  6. Java层与Jni层的数组传递(转)

    源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...

  7. java层 android_Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  8. jni java返回数组_Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  9. Android开发实践:Java层与Jni层的数组传递

    Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni ...

  10. java 通信层_Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...

最新文章

  1. MAP(Mean Average Precision):
  2. 【Mybatis】MyBatis 实现多表查询
  3. doublevalue_Java Double类doubleValue()方法与示例
  4. C# 根据年、月、周、星期获得日期等
  5. Mysqldump 1449 错误解决 mysqldump: Got error: 1449
  6. 计算机一级操作题题库在线,全国计算机一级操作题「题库」
  7. 基于SpringBoot的个人博客系统【完整项目源码】
  8. w10系统 计算机快捷键大全,Win10电脑快捷键汇总_Win10系统快捷键大全_玩游戏网...
  9. 服务器数据恢复成功案例+服务器数据恢复 原理
  10. 魅族手机怎么把计算机放到桌面,魅族手机怎么投屏到电脑 照片怎么传到新手机...
  11. pd.DataFrame()函数解析(最清晰的解释)
  12. 关于微信第三方平台$APPID$.wx.abc.com的问题
  13. iOS 应用架构 (二)
  14. 游戏评测HTML5网站模板是一款适合游戏视频 游戏评测 游戏介绍网站模板。
  15. 摄影测量转角系统转换——OPK转换至POK下
  16. PCIe driver
  17. 解决Access denied for user ''@'localhost' to database 'mysql
  18. cosmos官方scavenger_hunt_game测试项目部署
  19. 餐桌_纪中1237_水暴力
  20. ECCV22 | 从单目RGB图像中进行类别级6D物体姿态估计的物体级深度重构

热门文章

  1. 随手记_重建的五花八门的点云地图效果(供娱乐)
  2. 图像语义分割(15)-ConvCRFs:用于语义分割的卷积条件随机场
  3. ICCV2021|性能优于何恺明团队MoCo v2,DetCo:为目标检测定制任务的对比学习
  4. CVPR2020 论文分类及全部下载!
  5. Mongodb的oplogsize修改
  6. Luogu5280 [ZJOI2019] 线段树 【线段树】
  7. SqlServer三种常用窗口函数
  8. 在Linux的Terminal中显示文本文件特定行的内容
  9. 【漏洞预警】Intel爆CPU设计问题,导致win和Linux内核重设计(附测试poc)
  10. IDEA Maven Mybatis generator 自动生成代码