上周四下午同事提了一个需求,想要监控app切换到后台和息屏的事件。原因是因为用户在使用app时大多数时候不会去主动关闭app,又因为我们的app和远程服务器有一个数据池的长连接,所以用户不主动退出就导致了连接数只增不减,最终down掉。所以他想在上述的两种事件中强制app退出。
其实我有点怀疑服务器传输堵塞可能不是这个问题造成的,连接池都会有超时熔断的操作,应该不会有连接不收回的情况。但是他既然有这个需求,那就先试着实现吧。
分析
想要实现后台切换监控,第一个想到的就是从activity生命周期下手,对于Lifecycle大家应该都很熟悉了,从一个a到另一个a经历了几个过程呢?
假设有两个页面 a 和 b。
有些人觉得跳转过程是下面这样:
展示a界面:a.onCreat -> a.onStart -> a.onResume
跳转b界面:a.onPause -> a.onStop -> b.onCreat -> b.onStart -> b.onResume
其实跳转时的触发顺序是这样:
跳转b界面:a.onPause -> b.onCreat -> b.onStart -> b.onResume -> a.onStop
看到区别了吧?也就是说,一个界面在展示时总会触发onStart,但是触发onStop时却是在第二个页面触发onStart之后。
换句话说:只有在手机息屏和app切换到后台时onStart和onStop的触发数目才能相等。
由此咱们可以得出一种方案,通过计数来判断当前app的状态。
具体的代码:
1 | public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks {//通过继承截获activity的周期方法 |
在监控到两种事件发生后,会发出一个通知,2小时后杀死进程。开始的时候这里直接调用System.exit(0)发现没什么用,后来明白这个exit只是退出虚拟机,页面并没有退出,后来参照了网上的做法获取activity栈,遍历移除。
算是完成这个需求了。但是这个退出有点暴力,如果各位朋友有更加优雅的退出方法请联系我哦~~