公司最近做项目有这样的一个需求:当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()
这里有两个答案,请问哪个才是正确答案呢???(看仔细啦,一定要看仔细啦)其实在csdn上我在重要的地方标记了颜色,但是到掘金阅读的时候就看不到颜色了,确实有点坑,想看原文的,可以点击我的博客地址去看,原汁原味的~~~
(请思考若干分钟.........)
好了,现在我来告诉你的答案:
我就不啰嗦了,正确答案是②,答案①是错误的,至于为什么,自己去写代码测试吧,实践得真知,我就不贴代码了。
从答案②我们可以得出这样一个结论,也就是当一个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在前台运行。
如果还有不懂,就留言吧,我会给你解答的。
Q.E.D.