守护进程是一个黑色地带的产物,无论是通过native的方式在linux中fork进程达到,还是在java层通过两个service守护的方式,都是不太友好的做法,据很多人反应,总有一些实际的业务场景中,希望自己的应用保持live状态,
一种是在native中做:
-
linux中多进程;
-
unix domain套接字实现跨进程通信;
-
linux的信号处理;
-
exec函数族的用法;
把他们组合起来实现了一个双进程守护,几个实现双进程守护时的关键点:
1.父进程如何监视到子进程(监视进程)的死亡?
2.子进程(监视进程)如何监视到父进程死亡?
3.父子进程间的通信
这种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
效果图:
以上完整代码下载链接:
https://github.com/hejunlin2013/MultiMediaSample
typescript array方法 typescript数组方法
数组的类型在 TypeScript 中,数组类型有多种定义方式,比较灵活。「类型 + 方括号」表示法最简单的方法是使用「类型 + 方括号」来表示数组:let fibonacci: number[] = [1, 1, 2, 3, 5];数组的项中不允许出现其他的类型:let fibonacci: number[] = [1, '1', 2, 3, 5];
// Type 'string' is n
现有一组name为hobby的复选框,要获取用户选择的值1 <p class="hobby">
2 兴趣爱好:
3 <input type="checkbox" name="hobby" value="read">阅读
4 <input type="checkbox" name="hobby" value="music">音乐