`

android间接实现前后台判断

 
阅读更多

Android项目里要判断是Home按键。可是Home键不提供监听。麻烦。。
在应用里,按了home键就是被调到后台,再回到应用就是后台调到前台,那看看有没有可以判断应用前后台的方法吧。
如果整个项目只有一个Activity,那么简单了,利用生命周期函数,在onResume()方法里可以简单判断后台还是前台。
可是项目里有N多个Activity,调用关系复杂,生命周期耦合太多,,判断方法容易出错。
网上有办法通过ActivityManager获得栈顶的Activity的包名,然后判断是不是自己应用。
没有采用,因为Activity实在太多,每一个都加入这个方法,或者加入方法调用,这个工作量阿。。。
当然这也是一个备选方案了。。。


忽然发现项目里所有Activity都继承自一个BaseAcitvity(BaseAcitvity再继承自android的Acitvity类)。看来可以加判断方法到这个BaseAcitvity类里。
但是每一次进入都要调用调用这个方法,获取服务,获取列表,获取应用信息,最后只为了获得一个标记位的值,感觉好浪费。
继续作为备选方案吧。。


重新思考。既然已经被调到后台,那就是说,当前应用的所有页面都不在前台显示,
也就是说,当前应用的所有Acivity都至少走完了onPause()方法。
而且,我们应用的所有acitivity都继承自一个BaseAcitvity,那么在BaseAcitvity的onPause()里做个计数吧,



计数方法如下:

BaseAcitvity的onResume()或者onStart()方法里,++count;
BaseAcitvity的onPause()或者onStop()方法里,--count;


判断方法如下:
在onRestart()方法里判断count,如果<=0(事实上,不应该小于0),那么就是从后台进入了前台。


如此,应用里每一个Activity都会在前台时++count,移入后台时--count。
count好像堆栈计数,前台显示时就是push,计数加1;后台不显示时就是pop,计数减1。
堆栈里有Activity就是应用在前台,计数肯定>1;计数为0说明堆栈没有Activity,说明没有Activity在显示,应用在后台。


由此判断得以简单高效判断应用自身前后台状态,间接实现(部分的)Home键判断。


之所以是部分的Home键判断,因为这个方法只能判断前台后台状态,不是根据Home的key事件来判断的。

所以,如果应用被其他应用暂时中断,比如来电,锁屏等等,也会被当作Home事件来处理。


后记:这个方法在灭屏时会出问题,我是在onResume和onStop方法里计数,灭屏再点亮只会执行onPause和onPause,这样计数就会错乱。

所以对这个方法改进一下:

1 BaseActivity中声明一个静态的hashMap。

2 每一个继承自BaseActivity的Activity需要实现一个方法getAcitivityID(),返回一个ID,每个AcitivityID都不相同。

3 在onCreate、onStart、onResume 里操作hashMap,添加getAcitivityID()返回值,如果存在则不添加。

4 在onDestroy、onStop、onPause里操作hashMap,删除getAcitvityID()返回值,如果不存在则不操作。

5 子AcitvityID可以在调用super.onSart()或者super.onReume()前,判断hashMap的长度,如果是0,则是从后台调入前台的。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics