android view 生命周期 android生命周期函数_android




总结:


1.oncreate


2.onstart            可见但不交互


3.onrestart         从其他界面重新调转过来


4.onresume       可交互


5.onpase


6.onstop            不可见


7.ondestroy








BACK键:

当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法,如下图所示:


android view 生命周期 android生命周期函数_android_02

HOME键:

当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,

而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,这时候应用程序并没有销毁。如下图所示:




android view 生命周期 android生命周期函数_activity_03



而当我们再次启动ActivityDemo应用程序时,则先后分别执行了onRestart()->onStart()->onResume()三个方法,如下图所示:


android view 生命周期 android生命周期函数_activity_04




1.OnstartActivityResult



onnewintent



3. onSaveInstanceState



4.onconfigChange



5.setTheme



onStart是可见,但并不可交互的,onResume才可交互的,这也是onStart(可见)和onResume(可见且可交互,在前台了)的区别



场景:


在实际应用场景中,假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity。那么对AB来说,具体会回调哪些生命周期中的方法呢?回调方法的具体回调顺序又是怎么样的呢?

开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此时如果点击Back键,将依次执行B:onPause -> A:onRestart

至此,Activity栈中只有A。在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。我们先直接看下实验结果:

此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。



     在之前的项目开发过程中,当时遇到一个很奇怪的问题: 手机上的“开发者选项”中有一个“不保留活动”的设置,当开启此设置,手机上的设置提示是“用户离开后即销毁每个活动” ,开启后,对于其他的应用程序是从A Acticity到B Activity,然后Back键回到A,此时,其他应用程序只是先白屏(有可能黑屏等,取决于主题设置)一下,然后A开始可见,但是我的应用程序中出现的一个结果却是直接返回到了桌面。一开始百思不得其解。最后终于定位出问题。首先,我们需要明确开启此设置项后对Activity生命周期的影响。 开启此设置项后,当A到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop -> A:onDestroy。是的,A在系统原本的生命周期回调中增加了onDestroy。此即“用户离开后即销毁每个活动”的含义。但此时需要注意的是,只要没有认为的调用A的finish()方法,虽然A执行了onDestroy,但Activity栈中依然保留有A,此时B处于栈顶。那么在B中按Back键回到A时,将依次执行:B:onPause -> A:onCreate -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。没错,A从onCreate开始执行了。此处也就解释了为什么A可能会出现白屏(或黑屏等)一下的原因了。




这样的结果:开启“不保留活动设置” ,back键或者不可见或者home,都执行Ondestroy方法,但是栈没有被移除!




如果需要移除可以执行:






AppManager.getAppManager().finishActivity(this);
1 /** 2  * 结束指定的Activity
 3  */ 4 public void finishActivity(Activity activity) {
 5     if (activity != null) {
 6         activityStack.remove(activity);
 7         activity.finish();
 8         activity = null;
 9     }
10 }