Activity的生命周期

来源:互联网 发布:灰原哀毛利兰人气知乎 编辑:程序博客网 时间:2024/05/16 15:48

有两个Activity  :MainActivity  和SecondActivity

第一次启动的时候,执行的顺序是:

MainActivity onCreate()....             //开始创建的时候调用
MainActivity onStart()....                //能看到界面,但是不能交互         可以做一些初始化的工作,比如获取某个对象的实例或者获取流等
MainActivity onResume()....       //和用户交互


然后按主页键,执行的顺序又是:

MainActivity onPause()....
MainActivity onSaveInstanceState()....    //注意保存数据,因为此时:MainActivity不可见,有可能会被虚拟机回收
MainActivity onStop()....

再次进入MainActivity时(没有被摧毁),执行的顺序又是:

MainActivity onRestart()....
MainActivity onStart()....
MainActivity onResume()....

然后单击按钮跳转到SecondActivity,执行的顺序又是:

MainActivity onPause()....         //保存一些需要保存的数据
SecondActivity onCreate()....
SecondActivity onStart()....
SecondActivity onResume()....
MainActivity onSaveInstanceState()....   //保存数据
MainActivity onStop()....


若单击按钮跳转到SecondActivity(对话框的形式),执行的顺序又是:

MainActivity onPause()....
SecondActivity onCreate()....
SecondActivity onStart()....
SecondActivity onResume()....
MainActivity onSaveInstanceState()....


按主页键回到主页的时候,执行的顺序又是:

SecondActivity onPause()....
MainActivity onStop()....
SecondActivity onSaveInstanceState()....
SecondActivity onStop()....


再次启动程序的时候,执行的顺序又是:

MainActivity onRestart()....
MainActivity onStart()....
SecondActivity onRestart()....
SecondActivity onStart()....
SecondActivity onResume()....


按返回键回到MainActivity(MainActivity没有被回收,SecondActivity是对话框形式),执行的顺序又是:

SecondActivity onPause()....
MainActivity onResume()....
SecondActivity onStop()....
SecondActivity onDestroy()....

按返回键从SecondActivity跳转回MainActivity(MainActivity没有被回收),执行的顺序又是:

SecondActivity onPause()....
MainActivity onRestart()....
MainActivity onStart()....
MainActivity onResume()....
SecondActivity onStop()....
SecondActivity onDestroy()....

注:从上面两种情况来看,当明确知道SecondActivity是要销毁的时候,SecondActivity的onSaveInstanceState()这个方法不会执行




Activity的四种启动模式:

在activity标签中,设置属性android:launchMode

standard:默认为这种方式启动。通过这个方式启动,都会新建一个activity,将activity放入栈中;

singleTop:这种方式会首先判断activity栈顶是否为需要启动的activity,若是,则不再启动;若不是,则新建activity之后入栈

singleTask:这种方式会首先判断activity栈是否有需要启动的activity,若有,且该activity不是位于栈顶,就需要将它前面的activity全部岀栈;若没有,则新建入栈

singleInstance:这种方式是和其他程序共用一个activity



若需要递归退出activity,则可以使用onActivityResult()方法。

首先在栈顶的activity中调用方法setResult(RESULT_OK,intent)(调用位置根据实际情况决定,可能是按某个按钮退出所有的activity,也可能是按返回键退出所有的activity,

这个时候就需要重写onBackPressed()方法),接着finish()该activity,且setResult方法必须在finish之前。最后在启动它的父activity中判断resultCode是否等于它调用setResult方法设置的值,若等于,就可以finish父activity,然后再父activity中同样调用setResult方法设置值,在父activity的父activity中判断resultCode,依次类推,就可退出所有的activity。

使用startActivityForResult方法启动activity的顺序是:MainActivity----->SecondActivity------->ThirdActivity

每个activity的方法的执行顺序是:

ThirdActivity onPause()....
SecondActivity onActivityResult()....
MainActivity onActivityResult()....

SecondActivity onDestroy()....
MainActivity onDestroy()....
ThirdActivity onStop()....
ThirdActivity onDestroy()....

若在启动的时候需要传递值,且该值经过加工之后需要传回原来的activity,则需要在子activity中取出该值,加工,然后放入另外的intent中,最后在栈顶的activity中(也可以是中途的某个activity)将加工过的intent传回去。


0 0
原创粉丝点击