在Android平台上,开发一个需要长期驻留在后台的App是一项挑战,因为系统和各种安全应用可能会自动清理掉非必要的服务。为了实现这样的需求,开发者通常会探索各种策略,其中之一就是利用JNI(Java Native Interface)来创建守护进程。守护进程是一种在后台独立运行的进程,即使主应用程序被关闭,它仍然能够继续运行,监控并保持服务的状态。 我们来理解一下Android中守护进程的基本概念。守护进程是独立于控制终端的进程,它们定期执行任务或者等待特定事件的发生。在Android中,由于系统设计的原因,普通的服务在主进程被结束时也会被一同终止。因此,开发者需要寻找一种方法,使服务能够在主进程被杀死后依然能够存活并重新启动。 常见的尝试包括提高Service的优先级、在onDestroy方法中重启Service、使用广播等,但这些方法都有其局限性,例如无法应对进程被完全结束的情况。而在Android 4.4及以上版本,当应用程序完全退出后,接收广播也会变得困难。 Android 5.0及以上版本在安全方面进行了加强,当应用退出时,不仅会杀死主进程,还会杀死与主进程同组的所有进程,这使得单纯通过Service或广播来实现守护进程变得更为困难。 解决这个问题的一个方案是通过JNI和C/C++层的编程,创建一个子线程作为守护进程,该线程持续监测服务的状态,并在服务被终止时重新启动。在C/C++层面,我们可以使用`fork()`函数来创建子进程,然后调用`setsid()`使其成为会话组长,从而独立于父进程的会话组。此外,还可以使用`umask(0)`给予新进程更多的文件权限,防止权限限制问题。 以下是一个简单的示例代码片段: ```c++ 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); // 重置文件创建权限掩码 // ...其他守护进程逻辑,如检查并重启服务 } } ``` 这段代码展示了如何在C/C++层创建子进程并使其成为守护进程。守护进程会持续运行,即使主进程被杀死,它也能检测到服务是否运行,并在需要时重启服务。这种方法可以有效地绕过Android 5.0及更高版本对进程组的清理机制。 总结来说,通过JNI实现Android守护进程涉及到对Android系统底层机制的理解,包括进程管理、会话组和权限控制等。通过在C/C++层创建独立的子进程并设置适当的会话组属性,开发者可以创建一个能够抵御系统清理的守护进程,确保后台服务的稳定运行。然而,值得注意的是,这种做法可能会被视为系统优化的反模式,因为它可能会增加系统的资源消耗,因此在实际应用中应谨慎考虑。





























- 粉丝: 4
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 单片机信号发生器设计及仿真.doc
- 电子商务专业自评分析报告(专业刨析材料).doc
- 软件工程考试题含答案.doc
- 高中数学-第四章-导数及其应用-4.2-导数的运算-4.2.3-导数的运算法则-湘教版选修2.ppt
- 计算机软件中的插件技术及应用.docx
- 虚拟技术在计算机实验机房建设中的应用.docx
- 关于网络环境下信息技术课堂教学模式的探究.docx
- 计算机网络实验报告.doc
- 职称计算机考试基础知识章节试题及答案.doc
- PLC简单应用(1).doc
- 堆栈队列字符串匹配相关算法实现.doc
- JAVAME大学本科方案设计书天气预报.doc
- PLC在机器人喷涂生产线控制中的应用.doc
- 论社会保险基金财务会计的信息化.docx
- Access2010数据库-模块与VBA程序设计(详解)演示文稿.pptx
- JSP网上拍卖系统设计方案与实现.doc


