zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Activity生命周期

生命周期 Activity
2023-09-14 08:59:11 时间

利用记事本来巧记activity生命周期7个方法:
onCreate():创建时调用(记事本被打开)
onStart():用户可见时调用(记事本非最小化)
onRestart():用户重新可见时调用(记事本恢复)
onResume():开始和用户交互时调用(记事本获得焦点)
onPause():结束与用户交互时调用(记事本失去焦点)
onStop():用户不可见时调用(记事本最小化)
onDestroy():销毁时调用(记事本被关闭)

生命周期的作用:
①当用户接一个电话或切换到另一个程序不会崩溃
②当用户后台运行程序时不会销毁有价值的系统资源
③当用户离开再返回你的应用时不会丢失用户的进程
④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程

 

1.当程序启动之后,第一个Activity经过的生命周期方法是:
onCreate() →onStart() → onResume()方法

 

2.当第一个Activity A启动第二个Activity B的时候
(备注:第二个Activity完全遮盖住第一个Activity,并且这个过程中没有出现点击Home键,或者第一个Activity被杀死等异常情况,并且两个Activity的启动模式是标准模式),这两个Activity经历的生命周期方法是:
A onPause() → B onCreate() → B onStart() → B onResume() → A onStop() →
(此时Activity A已经在回退栈的最低端, Activity B已经在Activity A的上面,在回退栈的最顶端)

 

3.当通过点击后退键退出Activity B的时候:(此时Activity B 弹出回退栈)
→ B onPause() → A onRestart() → A onStart() → A onResume() → B onStop() → B onDestroy() 此时B被销毁

 

如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B
这个时候A会执行Java代码

public void onSaveInstanceState(Bundle outState) { 
super.onSaveInstanceState(outState); 
outState.putLong("id", 1234567890);
}

B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会 用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码

if(savedInstanceState != null){ 
long id = savedInstanceState.getLong("id"); 
}

就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整 一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置

 

横竖屏切换时候activity的生命周期
1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.
2.设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.
3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法.
activity对一些资源以及状态的操作保存,最好是保存在生命周期的onStart()函数中进行