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