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

公司最近做项目有这样的一个需求:当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在前台运行。


如果还有不懂,就留言吧,我会给你解答的。


个人博客:http://blog.csdn.net/wu_ming0821(定时更新技术贴,基本上都是工作中遇到的问题,很实用)

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值