利用Activity生命周期变化判断Activity是否处于前台

这篇博客探讨了如何利用Android中Activity的生命周期来判断应用程序是否处于前台。通过在BaseActivity的onPause方法中调用ActivityControlUtils.isApplicationRunOnForeground(),可以在应用切到后台时立即得知这一变化,从而及时保存程序数据。
摘要由CSDN通过智能技术生成

1. Activity生命周期及对应表现

 onCreate Activity第一次创建
 onStart    Activity可见
 onResume Activity进入前台栈顶
 onPause  Activity不处于前台栈顶(被结束,或者有新界面压入)
 onStop Activity不可见(若上层界面是透明对话框,对话框下的界面是不会进入onStop的)
 onDestroy Activity开始销毁

2. 判断应用是否处于前台

 **需求:**
 开发中我们经常会遇到APP在后台运行时被结束,或者直接就是用户清理内存下了杀手,这导致我们程序的数据丢失,无法再下次启动时衔接进度,如常见的游戏开发就是如此,直接就没存档怎么玩。
 因此我们希望在应用程序进入后台时立即进行自动存档,以便下次恢复程序运行进度。

**整理下思路:**
应用中只要有一个界面处于前台,那么应用就还在前台运行,所以讲道理所有界面都用一个变量isForeGround,onCreate 、onResume时设置为true,onPause设置为false即可,那么判断所有界面isForeGround的状态即可得到程序当前是否在前台运行。
想法总是那么美好(简单),然而一个Activity A启动另一个Activity B时生命周期走的是AonPause BonCreate BonStart BonResume AonStop,再比如B结束(finish())后生命周期走的是 BonPause AonRestart AonStart....
如你们所见,在当前界面执行onPause之后才会开启另一个界面,在执行onPause时isForeGround = false,确切的说是所有界面的isForeGround 都为false。

此问题是由于界面跳转引起的,再引入一个全局变量openMyActivity,当跳转的是我们APP的界面时改值为true,跳转后界面进入onResume我们再把这个值设置为false,这样只要openMyActivity == true(跳转到我们的界面),那肯定是还处于前台,其他情况根据所有界面的isForeGround 来判断即可

**怎么判断即将打开的是我们APP的界面?**
我们将所有创建(onCreate)的界面存入集合中,如果界面销毁(onDestroy),则从集合中移除。当有一个界面finish(),我们判断集合长度是否大于1(是否还有另一个界面),如果有,那就是打开那个界面,此时应该设置openMyActivity = true。
那么对于startActivity进行跳转呢?这种显示跳转打开下个界面Intent中含有下个界面的class,我们取的class全类名,判断是否包含包名,如果包含包名则是打开我们的界面,此时openMyActivity设置为true。

这样我们先判断openMyActivity是否为true,是的话程序处于前台,否则判断所有界面isForeGround,如果有一个处于前台,则程序也处于前台,下面给出代码。
/**
 * Activity基类
 */

public class BaseActivity extends Activity implements ActivityControlUtils.IActivityControl {
   

    private
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值