活动的生命周期和启动
2021/3/23
1812190328 吴烨峰 安全1801
实验内容
1、通过在不同的活动之间的转换,观察onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况。
(1)新建项目ActivityLifeCycleTest,再创建两个子活动,NormalActivity和DialogActivity,然后分别创建 normal_layout.xml、dialog_layout.xml
normal_layout.xml和dialog_layout.xml,均添加一个textview内容如下
在NormalActivity和DialogActivity中加载这两个布局,然后在AndroidManifest.xml中进行设置
接下来修改activity_main.xml,重新定制我们主活动的布局,主要是添加两个button,一个用来启动dialogactivity,另一个用来启动Normalactivity
最后修改MainActivity中代码
在onCreate()方法中,我们为两个按钮注册了点击事件,点击第一个按钮会启动Normal,第二个会启动Dialog,然后在七个回调方法中分别打印一句话,因此可以通过观察日志的方式来更直观地理解活动的生命周期
(2)运行程序,观察运行效果
Normal
返回后:
由于NormalActivity已经把MainActivity完全遮挡住,因此onPause() 和onStop() 方法都会得到执行。然后我们再按下back键返回MainActivity,此时我们再查看日志发现onRestart() 方法会得到执行,之后又会依次执行onStart() 和onResume() 方法。
Dialog
这时活动就处于暂停状态,可以通过打印的日志看到,只有onPause() 方法得到了执行,onStop() 方法并没有执行,这是因为DialogActivity并没有完全遮挡住MainActivity,此时MainActivity只是进入了暂停状态,并没有进入停止状态。
返回后:
再按一下back键,此时只有onResume() 方法会得到执行
再按一下back,则程序会依次会执行onPause() 、onStop() 和onDestroy() 方法,最终销毁MainActivity。
大概流程如下:
2、通过实验说明存在系统可能自行对活动运行onDestroy。
在进行翻转屏幕的时候,会更新Activity。因此可能自行运行onDestroy,因此我们对其进行翻转屏幕操作
此时发现日志中,onDestroy已经运行,所以这时候可以用bundle保存好数据,根据键值来保存数据,不建议用来保存实例,因为可能在返回时候已经过时了
同时,建议所有的activity最好都做好数据保存工作,在内存低的时候或者需要频繁翻转屏幕的时候,可以自动保存,提高用户体验
3、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
(1)在MainActivity中加入以下代码
前面的调用方法,用来取出保存的信息,后面是写了一个方法,存储死亡数据
4、通过实验说明活动的standard, singleTop, singleTask三种启动模式之间的区别点。
(1) standard: 标准模式
新建一个emptyactivity,在mainactivity中添加一个按钮,oncreate()代码如下
每点击一次按钮,就会创建出一个新的MainActivity实例,图中点击了5次按钮,因此要返回5次才可以退出程序
(2)singleTop:栈顶复用模式
要创建的Activity已经处于栈顶时,此时会直接复用栈顶的Activity。不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard模式一样。
修改manifest文件中MainActivity启动模式
不管点击几次按钮,都只出现了一条打印信息,因此只需一次BACK就可以退出了
但是当它并非出于栈顶时,仍然可以创建出新的activity,因此我们新建一个SecondActivity
在MainActivity中修改
在SecondActivity中代码如下
效果
此时,系统创建了两个不同的Activity,在Second中再次启动First时,栈顶活动已经变成了Second,因此创建了一个新的First,现在按下Back,回到Second,再按,就是回到First,再按一次,才退出程序
(3)singleTask:栈内复用模式
修改manifest
修改mainactivity
修改SecondActivity
效果