我之 Android Activity生命周期

Note:本篇文章除了讲解Activity最基本生命周期函数的调用流程外,还包含了个别辅助生命周期函数的调用时机。而之所以叫辅助生命周期函数?第一是因为它们的的确确属于Activity生命周期函数的范畴。第二则是因为它们他们在开发中不一定会被Activity自动调用,即使它们被调用了也只能起到一个辅助作用,因此我们称其为辅助生命周期函数。综上所述,所以我讲解的生命周期函数会多那么几个,请不要多疑,后面你就会明白的。。。

本篇博客是为大家讲解Activity基础生命周期函数的调用流程以及其开发中必要的辅助生命周期函数的调用时机,掌握之后我想你对Activity就算真的入门了,屁话不多说了。首先我们梳理一下要讲解的知识点:

A:Activity生命周期函数的调用流程,这里又可以分为基本流程,跳转无等待流程,跳转有等待流程这三种情况。除此之外我们还需要知道弹出提示框对Activity生命流程的影响有那些(这里又包括Dialog弹框,PopupWindow弹框,Activity窗口模式弹框)?最后说明一下,我们这里不讲解Activity嵌套Fragment的生命流程情况,等后面讲解Fragment生命周期的时候,你们自己融会贯通咯。(这里我们也顺道梳理一个问题:当前Activity切换到其他Activity的时候,当前Activity与被切换的Activity,他们彼此之间生命周期函数是怎样的一个调用流程?是否真的像很多朋友说的‘等到当前Activity生命周期函数调用完毕之后,才来调用被切换的Activity生命周期函数?‘)

B:针对Activity生命周期函数的调用流程,除了上面介绍的生命周期函数调用流程外。我们还可根据其当前是否完整的显示到屏幕上,从而得到其“显示生命周期”;我们也可以根据其当前是否支持交互,从而得到其“交互生命周期”;进而加强我们对整体的记忆和理解。

C:onSaveInstanceState()onRestoreInstanceState()两个辅助生命周期函数的调用时机。

D:onWindowFocusChanged()辅助生命周期函数的调用时机。

E:onBackPressed()函数的调用时机。

F:Back键Home键的区别与联系。

在讲解知识点之前,我先上传实例代码以及页面效果图,这样方便大家理解。MainActivity类:
public class MainActivity extends AppCompatActivity { private LinearLayout linearLayout;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); linearLayout = (LinearLayout)findViewById(R.id.linearlayout); Log.i("msg","MainActivity_onCreateRun"); } protected void onRestart() { super.onRestart(); Log.i("msg","MainActivity_onRestartRun"); } protected void onStart() { super.onStart(); Log.i("msg","MainActivity_onStartRun"); } protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i("msg","MainActivity_onRestoreInstanceStateRun"); } protected void onResume() { super.onResume(); Log.i("msg","MainActivity_onResumeRun"); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.i("msg","MainActivity_onWindowFocusChangedRun"+ (hasFocus?"true":"false")); } public void Next(View view) { Log.i("msg","MainActivity_NextRun"); startActivity(new Intent(this,SkipActivity.class)); } public void showDialog(View view) { Log.i("msg","MainActivity_showDialogRun"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("显示Dialog弹出框"); builder.setPositiveButton("关闭", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}); AlertDialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(true); dialog.show(); } public void showPopupWindow(View view) { Log.i("msg","MainActivity_showPopupWindowRun"); PopupWindow window = new PopupWindow(this); window.setContentView(LayoutInflater.from(this).inflate(R.layout.popupwindow,null)); window.setWidth(600); window.setHeight(250); window.setOutsideTouchable(true); window.showAtLocation(linearLayout, Gravity.CENTER,0,0); } protected void onPause() { super.onPause(); Log.i("msg","MainActivity_onPauseRun"); } public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); Log.i("msg","MainActivity_onSaveInstanceStateRun"); } protected void onStop() { super.onStop(); Log.i("msg","MainActivity_onStopRun"); } protected void onDestroy() { super.onDestroy(); Log.i("msg","MainActivity_onDestroyRun"); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.i("msg","MainActivity_onActivityResultRun"); } }
SkipActivity类:
 
 
public class SkipActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_skip); Log.i("msg", "SkipActivity_onCreateRun"); } protected void onRestart() { super.onRestart(); Log.i("msg", "SkipActivity_onRestartRun"); } protected void onStart() { super.onStart(); Log.i("msg", "SkipActivity_onStartRun"); } protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i("msg", "SkipActivity_onRestoreInstanceStateRun"); } protected void onResume() { super.onResume(); Log.i("msg", "SkipActivity_onResumeRun"); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.i("msg", "SkipActivity_onWindowFocusChangedRun" + (hasFocus ? "true" : "false")); } protected void onPause() { super.onPause(); Log.i("msg", "SkipActivity_onPauseRun"); } public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); Log.i("msg", "SkipActivity_onSaveInstanceStateRun"); } protected void onStop() { super.onStop(); Log.i("msg", "SkipActivity_onStopRun"); } protected void onDestroy() { super.onDestroy(); Log.i("msg", "SkipActivity_onDestroyRun"); } public void onBackPressed() { super.onBackPressed(); Log.i("msg", "SkipActivity_onBackPressedRun"); } }
                                                 
                                                

A:模块Activity基本生命周期函数的调用流程:

首先我们运行程序,启动MainActivity页面,然后查看打印的日志信息:
这图说明启动MainActivity页面首先他会调用onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。
然后我们点击返回按钮,此时MainActivity页面返回到了手机桌面,此时我们再查看打印的日志信息:
大家可以看到日志中我画了红线的部分,这是我们点击返回按钮后MainActivity调用的的生命周期函数,它们是onWindowFocusChanged(false),onPause(),onDtop(),onDestroy()这四个生命周期函数。
综上所述那么我们就可以确定Activity最基本的生命周期函数调用流程(其实就是单个Activity开启操作与关闭操作先后调用的生命周期函数)了哟:
开启Activity时,其生命周期函数调用流程:onCreate()->onStart()->onResume()->onWindowFocusChanged(true)。
关闭Activity时,其生命周期函数调用流程:onWindowFocusChanged(false)->onPause()->onStop()->onDestroy()。
Activity基本生命周期函数的调用流程=开启Activity时其生命周期函数调用流程+关闭Activity时其生命周期函数调用流程。至此,虽然我们了解了单个Activity生命周期函数的调用流程,但在实际开发中,我们需要更多的注意两个Activity切换时他们彼此之间的生命周期函数又是怎样的一个调用流程(相信没有任何一个完整的App只有一个Activity页面吧)?因此接下来我们将着重介绍当两个Activity页面切换时,他们彼此的生命周期函数是怎样的一个调用流程?针对这种情况我们又可以细分为:Activity页面与Activity页面无等待跳转流程Activity页面与Activity页面有等待跳转流程两种情况。

Activity页面与Activity页面无等待跳转流程:Activity页面与Activity页面无等待跳转流程(跳转):我们重新启动程序,查看打印的日志信息:

这时MainActivity页面已经正常显示了,接下来我们点击跳转按钮无等待进入SkipActivity页面,然后我们再来查看打印的日志信息:

根据上面的日志信息,接下来我们分析MainActivity页面是如何无等待跳转到SkipActivity页面的?特别是他们彼此之间的生命周期函数又是怎样的一个调用流程呢?

1:首先是MainActivity自动调用其onPause(),onWindowFocusChanged(false)这两个生命周期函数。

2:然后是SkipActivity自动调用其onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。

3:最后MainActivity还会再自动调用其onStop()这一个生命周期函数。

至此,我们便讲清楚了,从MainActivity页面无等待跳转到SkipActivity页面时他们彼此之间生命周期函数的调用流程。

Activity页面与Activity页面无等待跳转流程(回退):

那么接下来我们再看SkipActivity页面是如何一步步无等待回退到MainActivity页面的?看看此时它们生命周期函数又是怎样的一个调用流程?请看下面打印的日志信息:
根据上面的日志信息,接下来我们分析SkipActivity页面是如何无等待回退到MainActivity页面的?特别是他们彼此之间的生命周期函数又是怎样的一个调用流程呢?
1:首先是SkipActivity自动调用其onPause()这一个生命周期函数。
2:然后是MainActivity自动调用其onRestart(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。
3:最后SkipActivity还会再自动调用其onWindowFocusChanged(false),onStop(),onDestroy()这三个生命周期函数。

至此,我们也讲清楚了,从SkipActivity页面无等待回退到MainActivity页面时他们彼此之间生命周期函数的调用流程。

Activity页面与Activity页面有等待跳转流程:Activity页面与Activity页面有等待跳转流程(跳转):我们重新启动程序,查看打印的日志信息:

这时MainActivity页面已经正常显示了,接下来我们点击跳转按钮有等待进入SkipActivity页面(注意,此时我们启动SkipActivity页面调用的是startActivityForResult()函数),然后我们再来查看打印的日志信息:

根据上面的日志信息,接下来我们分析MainActivity页面是如何有等待跳转到SkipActivity页面的?特别是他们彼此之间的生命周期函数又是怎样的一个调用流程呢?

1:首先是MainActivity自动调用其onPause(),onWindowFocusChanged(false)这两个生命周期函数。

2:然后是SkipActivity自动调用其onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。

3:最后MainActivity还会再自动调用其onStop()这一个生命周期函数。

至此,我们便讲清楚了,从MainActivity页面有等待跳转到SkipActivity页面时他们彼此之间生命周期函数的调用流程。

Activity页面与Activity页面有等待跳转流程(回退):

那么接下来我们再看SkipActivity页面是如何一步步有等待回退到MainActivity页面的?看看此时它们生命周期函数又是怎样的一个调用流程?请看下面打印的日志信息:
根据上面的日志信息,接下来我们分析SkipActivity页面是如何有等待回退到MainActivity页面的?特别是他们彼此之间的生命周期函数又是怎样的一个调用流程呢?
1:首先是SkipActivity自动调用其onPause()这一个生命周期函数。
2:然后是MainActivity自动调用其onActivityResult(),onRestart(),onStart(),onResume(),onWindowFocusChanged(true)这五个生命周期函数。
3:最后SkipActivity还会再自动调用其onWindowFocusChanged(false),onStop(),onDestroy()这三个生命周期函数。

至此,我们也讲清楚了,从SkipActivity页面有等待回退到MainActivity页面时他们彼此之间生命周期函数的调用流程。那么接下来我们就讨论在Activity页面弹出各种弹出框的情景。最后我们再针对Activity之间切换的情况,总结一个知识点:当Activity之间发生切换的时候(排除Activity以窗口样式弹出的情况)。如果是跳转切换:首先让当前显示的Activity失去焦点并暂停它,然后创建并运行即将跳转的Activity,最后等到跳转后的Activity正常运行再停止之前暂停的Activity。如果是回退切换:首先仅仅暂停当前显示的Activity,然后重新启动即将跳转的Activity,最后等到跳转后的Activity正常运行再使之前暂停的Activity失去焦点并停止。在Activity页面弹出提示框或者关闭提示框时,Activity将自动调用那些生命周期函数:在Activity页面弹出Dialog提示框时,Activity将自动调用的生命周期函数:

在实际开发中,Activity页面一般都会伴随一些提示框,那么这些提示框在弹出来的时候对Activity生命周期函数调用流程有没有影响呢?如果有影响,那么又是什么影响?首先我们还是启动程序,查看打印的日志信息:
MainActivity任然先是调用onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。
接下来我们打开一个Dialog提示框(效果图如下),然后再查看打印的日志信息(效果图也如下):


通过上面打印的日志信息(特别是红色矩形框标记的部分),我们可以得出结论:当在Activity页面弹出Dialog提示框时,首先是Activity回调onWindowFocusChanged(false)这一个生命周期函数,之后才是显示Dialog提示框。
在Activity页面关闭Dialog提示框时,Activity将自动调用的生命周期函数:
接下来关闭这个Dialog提示框(这里就不需要效果图了哈),我们直接查看打印的日志信息:

通过上面打印的日志信息(特别是红色矩形框标记的部分),我们可以得出结论:当在Activity页面关闭Dialog提示框时,首先是关闭Dialog提示框,之后才是Activity回调onWindowFocusChanged(true)这一个生命周期函数。
至此,我们便讲清楚了在Activity页面弹出Dialog提示框或者关闭Dialog提示框时,Activity将自动调用的生命周期函数有那些!

在Activity页面弹出PopupWindow提示框时,Activity将自动调用的生命周期函数:
我们重新启动程序,查看打印的日志信息:
MainActivity任然还是调用onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。
接下来我们打开一个PopupWindow提示框(效果图如下),然后再查看打印的日志信息(效果图也如下):


通过上面打印的日志信息(特别是红色矩形框标记的部分),我们可以得出结论:当在Activity页面弹出PopupWindow提示框时,Activity不会回调其任何的生命周期函数。
在Activity页面关闭PopupWindow提示框时,Activity将自动调用的生命周期函数:

接下来我们关闭这个PopupWindow提示框(这里也不需要效果图了哈),并查看打印的日志信息:

是的!即使我们关闭了PopupWindow提示框,这个打印日志也没有发生任何变化,于是我们可以得到结论:在Activity页面关闭PopupWindow提示框时,Activity不会回调其任何的生命周期函数。至此,我们便讲清楚了在Activity页面弹出PopupWindow提示框或者关闭PopupWindow提示框时,Activity将自动调用的生命周期函数有那些!

Activity以提示框样式在Activity页面弹出时,Activity页面与Activity提示框将自动调用的生命周期函数:我们重新启动程序,查看打印的日志信息:

MainActivity任然还是调用onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数。
接下来我们打开一个Activity提示框(效果图如下),然后再查看打印的日志信息(效果图也如下):


通过上面打印的日志信息(特别是红色矩形框标记的部分),我们可以得出结论:当在Activity页面弹出Activity提示框时,首先是当前显示的Activity页面调用自己的onPause()和onWindowFocusChanged(false)这两个生命周期函数,然后才是即将显示的Activity提示框调用自己的onCreate(),onStart(),onResume(),onWindowFocusChanged(true)这四个生命周期函数,这样就完成了在Activity页面显示Activity提示框的操作流程。

Activity以提示框样式在Activity页面关闭时,Activity页面与Activity提示框将自动调用的生命周期函数:接下来我们关闭这个Activity提示框(这里也不需要效果图了哈),并查看打印的日志信息:


各位可以根据这个打印的日志信息好好想想-->关闭在Activity页面显示的Activity提示框,他们彼此的生命周期函数调用流程是怎样的呢:在Activity页面关闭Activity提示框时,首先是Activity提示框调用自己的onPause()这一个生命周期函数,然后再是即将显示的Activity页面调用自己的OnResume(),onWindowFocusChanged(true)这两个生命周期函数,最后才是Activity提示框调用自己的onWindowFocusChanged(false),onStop(),onDestroy()这三个生命周期函数,这样就完成了在Activity页面关闭Activity提示框的操作流程。
至此,我们便讲清楚了在Activity页面弹出Activity提示框或者关闭Activity提示框时,Activity页面和Activity提示框它们彼此之间将自动调用的生命周期函数有那些!也是直到这里,我们便讲清楚了在Activity页面弹出各种提示框或者关闭各种提示框时,Activity将自动调用的生命周期函数都有哪些!!!B:模块
Activity显示生命周期和Activity交互生命周期:Activity显示生命周期(控制Activity是否显示的生命周期函数)onStart(),onResume(),onWindowFocusChanged(true),onWindowFocusChanged(false),onPause(),onStop()。
Activity交互生命周期(控制Activity是否支持交互操作的生命周期函数)
onResume(),onWindowFocusChanged(true),onWindowFocusChanged(false),onPause()。
至此,关于Activity显示生命周期和Activity交互生命周期我们就总结完了!至于有读者发问为什么我没有去讲解分析过程,我只想说分析过程比较简单,如果你有认真看A模块的内容,那么你再稍微分析一下就可以得出这个结论,所以这里我就不做多的解析了,毕竟,浪费大家的时间是不好的C:模块onSaveInstanceState()和onRestoreInstanceState()辅助生命周期函数调用时机:onSavaInstanceState()辅助生命周期函数的调用时机:当当前显示的Activity马上结束显示时,如果这个























这个时候我相信有部分读者会问:“为什么Activity的启动操作和关闭操作都会调用onWindowFocusChanged()函数?它的参数代表什么意思?”。还请诸位倾听老衲一一道来。官方文档的说法是,当显示的Activity窗口获取焦点或者失去焦点的时候则会调用该方法。那读者大大们,现在是否已经解决了你们刚刚提出的疑惑(不懂的话,自己慢慢想!)?接下来老衲再扩展一下知识点:不知道有没有读者原来在onCreate(),onRestart(),onStart(),onResume()这四个函数中获取过控件的宽高?是不是获取的数据始终为0?当然,这个问题我们也是可以通过ViewTreeObserver类来解决的,但是现在,我再为大家提供一种新的思路,那就是直接在onWindowFocusChanged()函数中获取控件的宽高,这样就肯定能获取到控件的宽高值了,问我Why?因为在onWindowFocusChanged()函数回调的那一刻开始,界面已经显示完毕(上面我说过的吧!),所有控件的宽高值都已确定,所以就能获取到具体的数值了。不信的话,你可以试试!嘿嘿



但是呢?这里还是有需要注意的地方哈!这种情况其实只会出现在activity和主界面之间通过back键的切换,以及activity和activity之间在完全覆盖界面的条件下切换时,才会发生这种情况。为毛我会这么说呢?因为在activity里面,我们能够通过函数setTheme(android.R.style.Theme_Dialog)设置activity以窗口模式弹出,这个时候,切换的activity就不会完全覆盖之前的activity,那么情况就不一样了!连带的,如果在同一个activity里面让一个activity以窗口的形式弹出和弹出一个真正的dialog(一个真正的窗口),又有什么区别呢?接下来我们慢慢讲解:
此时,我把之前的代码在新起的activity里面粘贴了一次,接下来就把之前的activity叫做A,现在新起的叫做B,这样搞我方便些哈。
在A里面启动B,我们来看真相:

现在开始,这里会混杂着讲解 --> 屏幕的显示生命周期以及之前提及的特征第3点:“当前activity切换到其他activity的时候(无论是启动,还是回退),并非是当前activity生命周期完全结束后才启动的其它activity,而是另有隐情!”一起讲解:
首先,大家看上面的真相,有“-”符号的代表是activityB,通过真相我们可以知道当启动别的activity的时候并不是先完全的结束A,然后启动B。而是先把A通过其onpause()函数“暂停”掉,然后马上启动B,等B启动完毕之后,再回过来“停止”A,注意这里暂停和停止的区别哈。
此时B完全的遮挡和代替了A,也就是我们在界面上是看不见A了,看见的都是B,接下来,我点击back键,让B切换到A。请看真相:

同理可得:界面由B返回了A,过程是先“暂停”了B,然后启动A,等到A完全的运行之后,再“停止“了B,并且完全的销毁了B。或许在这里有人会问为什么A跳转B的时候没有销毁A呢?其实这是android内置机制决定的,android内置机制有一个专门记录activity的堆栈,正是因为这个,所以在你后退界面的时候,android才能知道应该回退到那个界面,你说是吧?这里对这个就不先讨论了哈。接着上面说,那么现在你就应该知道一个结论了:
“当activity界面切换的时候(无论跳转还是回退),都是先暂停当前页面,启动并正常运行跳转页面,等到跳转页面正常运行后,再决定暂停页面是否停止以及是否销毁。”       那么关于我们讨论activity的第三个特征就先结束了哈。
接下来我们再仔细想想刚刚当我们从B跳转到A的时候,A是从不可见到可见的变化。那么第二个生命周期“屏幕的显示生命周期”也跟到出来了,根据真相我们不难看出它的作用域是这样的:通过调用A的onrestart(),onstart(),onresume()让A达到完全运行的状态。和最开始不同的是,因为之前A是创建了的,跳转到B只是停止了A,但是并未销毁A,所以当我们回退的时候,系统会启用之前的A,所以就可以在不用执行oncreate()函数就可以让A达到完全运行的状态。当然,“屏幕的显示生命周期”的作用域并非如此,再结合A跳转B的效果图,我们可以想到A还启动用了onpause(),onstop()方法,综上所述:
“屏幕的显示生命周期”完整的表达是:onstart(),onresume(),onpause(),onstop()。
或许这里也有人问,为毛onrestart()不在这里面,对于这个问题,我的理解是,当首次启动页面显示的时候,并没有调用onrestart()函数,那就说明它并未包含在“屏幕的显示生命周期”中,如果非要说明什么,我觉得也只能说明切换的当前页面是在被其他页面“完全遮挡”的情况下“回退”并显示出来的。至此,“屏幕的显示生命周期”讲解搞定,接下来我们再看“应用的交互生命周期”。






这里呢!我们不光要讲解“应用的交互生命周期”,还要混杂着activity以窗口模式弹出,以及弹出真正的窗口(dialog)对actvity生命周期的不同影响一起讲解:现在我把B改成了以窗口模式弹出,我再运行程序,让A跳转到B,大家看真相:

和之前从A跳转到B的区别不知道大家看清楚没有?之前A跳B的时候A是调用了A的onstop()方法的,而这里并没有,因为真相上就没有”55555555555555555555555“的存在!!!所以,一个activity是否以窗口模式弹出(或者说是否完全遮挡之前的activity)的影响之一是:之前的activity是否会调用onstop()方法来“停止”自己。
然后我们再关闭B返回A,再看真相:

此时在真相中不难看出从B到A,只是调用A的onresume()方法,并未像之前还调用了onrestart()以及onstart()方法。所以,综上所述:如果activity以窗口模式弹出,那么在它之前的activity在进行activity切换的时候,将不会调用onstop(),onrestart(),onstart()方法。
那么如果我们在activity里面弹出dialog对activity生命周期的影响是什么呢?会和activity以窗口模式弹出的影响一样吗?接下来我们在A里面弹出一个弹出框(dialog)并关闭,我们看真相:

A相当淡定,除了表明其正在运行意外,其他的什么都没有。所以,根据真相我们也可以得出结论,如果在activity里面弹出dialog,对activity生命周期完全没有影响。
最后,我们还是总结性的得出3个小结论:
1:activity和activity发生界面切换的时候,如果切换的界面能够完全遮挡之前的界面,那么暂停之前的activity之后还会调用它的onstop方法。
2:activity和activity发生界面切换的时候,如果切换的界面不能够完全遮挡之前的界面,那么暂停之前的activity之后不会调用它的onstop方法,只会调用其onpause方法。
3:如果在activity里面弹出dialog,dialog的弹出对activity的生命周期是完全没有影响的。
接下来并没有玩完,不知道大家有没有想起,我们说好讨论的“应用的交互生命周期”并没有讲呢?其实,我已经讲解出来了,只是大家没有去细想而已,接下来继续弄呗,大家现在继续仔细想想,当我们把B设定为窗口模式弹出的时候,此时我们是无法立即点击原本属于A的地方的,只有等到B消失后,才能点击A,哈哈!这就是问题所在,我们从A启动B,B返回A的这整个流程加上相应的“真相”可以明白:A从不能点击到可以点击,A调用了onpause(),onresume()两个方法,所以,这里也可以得出结论了:
完整“应用的交互生命周期”应该是:onresume()开始,onpause()结束。
自此,关于activity的5个(运行状态),3个(生命周期),3个(界面切换是否完全覆盖的分别影响), 2个(界面切换的顺序)-------->>>>>>>>讲解完毕,接下来讲解back和home的区别和相互实现。



关于back键和home键,我这里只做简单介绍了哈,毕竟篇幅太大了就啰嗦了,这个也不难,只需要动下脑袋就搞定了哈:
1:back键是回退,它会消除activity堆栈中当前activity的记录。所以当你回退一个界面的时候,除非你指定跳转到之前的页面,否则没有办法通过原系统记录跳转到之前的页面。
2:home键看起和back键一样,因为他们在首次进入应用的时候都能点击一下就退到主界面。但是,他们实现的原理根本不一样,home键是跳转到主界面,而back是回退到主界面。其中的跳转和回退希望读者自己斟酌!
3:监听home键通过dispatchKeyEvent(KeyEvent event)实现,监听back通过onBackPressed()实现。
4:back键如果想实现home键的功能:那么只需要在onBackPressed()方法里面调用moveTaskToBack(true)方法,其中的参数意义:参数为false时,仅当应用中activity堆栈里面只有一个activity时,点击back键和home键效果一样。参数如果为true时,点击back键始终和home键效果一样。
自此,home键和back键简单讲解完毕。



这里还想提及一个点,感觉比较有意思。就是关于在android手机里面设置“不保留活口”这个点,我知道的也不多哈:
当我们进行页面跳转的时候,不管是否完全覆盖,都会把之前activity的生命周期方法全部运行一次(oncreate(),onstart(),onresume(),onpause(),onstop(),ondestroy()),但是,它并没有消除activity堆栈中的记录,因此一样可以返回,但是整个生命周期将发生变化,至于变化在哪里,这里就不讲解了,你们可以自己去瞅瞅就明白了!不要给我说没有用?等你们以后遇到进入二级界面的时候,应用莫名其妙闪退的时候,你就知道它的威力了!哈哈。
不好意思,还遗留了一个问题,或许会有人问:“如果activity不是通过startActivities(intents)启动!而是通过startActivityForResult(intent, requestCode)启动,那对activity生命周期的影响有那些?”关于这一点呢!我可以直接告诉大家,没有影响。顶多就只是在返回界面的时候优先调用一下onActivityResult(int requestCode, int resultCode, Intent data)
这个方法,然后代码走的依然是原来那个流程。

因为本人也是菜鸟,所以知道的也不多,如果谁知道的比较多,或则有什么问题,可以相互探讨或则留言哈!
如果大家觉得大兄弟写的还可以就给个赞呗!呵呵,求赞哈!
如有转载,请贴上原博客的地址:http://blog.csdn.net/garlic_you_ruthless/article/details/47084441,谢谢!
最后,还是放声长笑一下吧!“哇哈哈,总算特么的写完了,嘎嘎~~~”;


猜你喜欢

转载自blog.csdn.net/garlic_you_ruthless/article/details/47084441