开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家…虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了… 网上搜寻一番后,主要的方法有以下几种方法,但都是治标不治本: 1、提高Service的优先级:这个,也只能说在系统内存不足需要回收资源的时候,优先级较高,不容易被回收,然并卵… 2、提高Service所在进程的优先级:效果不是很明显 3、在onDestroy方法里重启service:这个倒还算挺有效的一个方法,但是,直接干掉进程的时候,onDestroy方法都进不来,更别想重启了 4、broa 【Android通过JNI实现守护进程】 在Android开发中,创建一个持久存在于后台的应用是一个挑战,因为系统和各种安全软件可能会强制关闭服务。常见的解决方案如提高Service优先级、改变进程优先级等,但它们往往不能从根本上解决问题。例如,提高Service的优先级只能在系统资源紧张时减少被回收的可能性;在onDestroy中重启Service,但当进程被直接结束时,onDestroy无法执行;使用广播广播,但在Android 4.4及以上版本,程序完全退出后广播接收变得困难。 在上述背景下,开发者开始考虑使用守护进程(Daemon)机制来确保服务始终运行。守护进程是在后台独立运行的进程,不受控制终端影响,可以定期执行任务或监控事件。在Android中,通常通过JNI(Java Native Interface)和NDK(Native Development Kit)编程来实现守护进程。 在Android 4.4中,当应用退出时,ActivityManagerService通过`killProcessQuiet(pid)`直接结束主进程。而在Android 5.0及以上版本,它还会使用`killProcessGroup()`杀掉整个进程组,导致子进程一同结束。因此,要在Android 5.0及以后版本实现守护进程,需要让子进程独立于主进程之外。 在C/C++层,可以通过以下步骤创建守护进程: 1. 使用`fork()`创建第一个子进程。 2. 在第一个子进程中调用`setsid()`函数,使其成为新的会话组长和进程组组长,从而脱离原始会话和终端。 3. 调用`umask(0)`设置文件创建权限,确保子进程能创建和访问文件。 4. 再次调用`fork()`创建第二个子进程,这个子进程将成为真正的守护进程。 5. 在第二个子进程中,可以编写轮询逻辑,检查Service的状态,如果Service被终止,则重新启动它。 示例代码片段如下: ```cpp int start(int argc, char* srvname, char* sd) { pthread_t id; int ret; struct rlimit r; int pid = fork(); LOGI("fork pid: %d", pid); if (pid < 0) { LOGI("first fork() error pid %d,so exit", pid); exit(0); } else if (pid != 0) { LOGI("first fork(): I'am father pid=%d", getpid()); //exit(0); } else { // 第一个子进程 LOGI("first fork(): I'am child pid=%d", getpid()); setsid(); LOGI("first fork(): setsid=%d", setsid()); umask(0); int pid = fork(); if (pid == 0) { // 第二个子进程 // 这里应有防止重复启动线程的处理 LOGI("I'am child-child pid=%d", getpid()); // 实现守护进程的逻辑,如轮询Service状态 } } } ``` 总结来说,通过JNI在Android中实现守护进程,可以确保服务在后台持续运行,即使主进程被关闭,守护进程仍然可以监控并重启Service。这种方法虽然复杂,但可以有效地解决应用被强制关闭的问题,尤其在面对Android 5.0及以上版本的进程组清理策略时。
剩余6页未读,继续阅读
- 粉丝: 3
- 资源: 930
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 智能笔项目源代码全套技术资料.zip
- 在线考试系统项目源代码全套技术资料.zip
- 高等数学学习资料合集 高等数学(工本)mind
- 西门子V90效率倍增-伺服驱动功能库详解简易循环功能库之Homing-V90PN.mp4
- 自考04741计算机网络原理真题及答案及课件
- 基于STM32芯片开发 安防系统 完整作品
- 4_base.apk.1
- 学生导师双选系统项目源代码全套技术资料.zip
- 自考02318《计算机组成原理》试题及答案 2014-2018及课件
- 图书管理系统,仅供参考
- 数据科学与大数据毕业设计系统项目源代码全套技术资料.zip
- 全国自考02197概率论与数理统计(二)试题及答案2014-2019
- CHGCOLOR压缩包
- 多轮自动红队方法提升大语言模型安全性
- python语言kssp爬虫程序代码XQZQ.txt
- 亲测源码云赏V7.0微信视频打赏系统源码已测试完整无错版
评论0