只要两行代码,就能判断一个App是否在前台运行

来源:互联网 发布:上海森伯格矩阵 编辑:程序博客网 时间:2024/04/28 13:51

转载:http://www.apkbus.com/blog-776157-61830.html

转载是给自己留一个笔记,没什么别的用途。向原作者的无私贡献致敬。 


公司最近做项目有这样的一个需求:当App在前台运行的时候,不接受推送通知;当App在后台运行的时候,接受推送通知。很显然,这是一个非常常见的功能,我们在微信或者QQ就能体验到这样的功能。


首先分析一下,假如我们需要完成这样的一个功能,谷歌官方有没有给我们提供现成的接口供我们调用?聪明的人应该都知道,如果谷歌官方提供了相应的解决办法,很有可能是回调方法,因为用回调方法来解决这个问题是很省内存的。

很可惜,谷歌并没有给我们现成的接口去判断该App是否是前台应用还是后台应用,至于网上的其他解决方案,我都亲自试了一下,效果不是很好,多多少少有些毛病。于是决定自己研究一下,有没有更简洁的办法。。。。。。以下便是我的结论,有兴趣的可以自己看下去


首先弄清楚一个问题,当一个Activity启动另外一个Activity的时候,这两个Activity的生命周期是如何变化的?(为了方便,我们假设这两个Activity的名字为“甲”Activity和“乙”Activity)


(请思考若干分钟.........)


好了,现在我来告诉你答案:

答案①:(甲)onCreate->(甲)onStart()->(甲)onResume()->甲正在运行中,此时甲需要跳转的到乙->(甲)onPause()->(甲)onStop()->(乙)onCreate->(乙)onStart()->(乙)onResume()->乙正在运行中

答案②:(甲)onCreate->(甲)onStart()->(甲)onResume()->甲正在运行中,此时甲需要跳转的到乙->(甲)onPause()->(乙)onCreate->(乙)onStart()->(乙)onResume()->乙正在运行中->(甲)onStop()->(甲)onDestory()


这里有两个答案,请问哪个才是正确答案呢???


(请思考若干分钟.........)


好了,现在我来告诉你的答案:

我就不啰嗦了,正确答案是②,答案①是错误的,至于为什么,自己去写代码测试吧,实践得真知,我就不贴代码了。

从答案②我们可以得出这样一个结论,也就是当一个Activity启动另外一个Activity的时候,会先执行onPause方法,然后去创建一个新的Activity,等到那个新的Activity启动完成,完全展示在我们的手机上的时候,系统才会去调用上一个Activity的onStop方法,或者可以这样说,只要我们的应用程序在前台,onStart和onStop这两个方法的执行次数肯定是成对出现的,如果没有成对出现,那肯定不是前台应用,自己好好体会~~~


那么问题来了,我们要怎么计算onStart()方法和onStop()方法的执行次数呢,一个app那么多Activity,需要在每个Activity里面写方法岂不是很愚蠢!!!

这个问题好解决,写一个BaseActivity,然后定义一个静态的int,让所有的Activity都继承这个类,在BaseActivity的onStart()方法和onStop()方法体内对静态的int进行操作,onStart()执行int++,在onStop()执行int--,当你要判断该应用程序是否是前台运行的时候,只要判断这个静态的int是否是0就好了,如果是0,说明所有的Activity都到后台了,如果是1,说明该App在前台运行。





0 0
原创粉丝点击