Activity的非正常销毁

来源:互联网 发布:电子处方软件 编辑:程序博客网 时间:2024/04/19 18:26

1 不同情况下activity的生命周期

为了方便描述,我们将activity的销毁分为正常销毁和非正常销毁:

  • 正常销毁:被销毁之后不会被自动重建。比如我们主动调用了finish()、杀死了进程、用户通过点击返回键退出了activity等。
  • 非正常销毁:被销毁之后会被自动重建。比如,当系统内存紧张时,不可见的activity可能被销毁以节省内存,当activity被重新展现时就会被自动重建。当手机屏幕旋转时,activity(如果没有锁定方向的话)也会被销毁并自动重建。

启动 -> 正常销毁

onCreateonStartonResumeonPauseonStoponDestroy

非正常销毁 -> 自动重建

onPauseonSaveInstanceState*onStoponDestroyonCreateonStartonRestoreInstanceState*onResume

注意这里的onSaveInstanceState和onRestoreInstanceState都是指单参数的方法。在api21之后sdk还提供了它们的双参数版本,它们的作用是允许我们在关机重启时保存和恢复数据。注意区分。

1 息屏 -> 亮屏
2 按home键返回桌面 -> 回到app
3 从activity1跳转到activity2 -> 返回activity1

onPauseonSaveInstanceState*onStoponStartonResume

可见,执行了onSaveInstanceState,但未执行onRestoreInstanceState。

总结一下:

  • 当activity被非正常销毁 或 有可能被非正常销毁时,都会调用onSaveInstanceState;
  • 只有activity被自动重建时才会调用onRestoreInstanceState。

2 activity非正常销毁时的数据保存与恢复

onSaveInstanceState(Bundle bundle)onRestoreInstanceState(Bundle bundle)的调用时机上面已经说过。利用这两个方法,我们可以在activity被非正常销毁和自动重建时保存和恢复数据,具体来说就是:

  • 当activity被非正常销毁或可能被非正常销毁时,会调用onSaveInstanceState(Bundle bundle),我们可以在此方法中将数据保存在参数bundle中。
  • 当activity被自动重建时会调用onRestoreInstanceState(Bundle bundle),这里的参数bundle其实就是onSaveInstanceState(Bundle bundle)的参数bundle,从中可以获取到我们之前保存的数据。

onSaveInstanceState(Bundle bundle)onRestoreInstanceState(Bundle bundle)的默认实现会保存并恢复诸如EditText中的文本、ListView中的滚动条位置等信息。如果想要保存和恢复更多的信息,如成员变量的值,就需要我们自己去onSaveInstanceState(Bundle bundle)onRestoreInstanceState(Bundle bundle)中实现了。

此外,onSaveInstanceState(Bundle bundle)中保存数据的bundle也会被传递给onCreate(Bundle bundle)。区别是,在onRestoreInstanceState(Bundle bundle)中的bundle不可能为null,而onCreate(Bundle bundle)中的bundle可能为null(当activity不是“非正常销毁并自动重建”时,即当activity正常启动时,此bundle就是null)。建议使用onRestoreInstanceState(Bundle bundle)来恢复数据。

3 activity非正常销毁时的Intent

在启动一个activity时,经常会通过intent传递一些数据过去:

//MainActivity.javaIntent intent = new Intent(this, Main2Activity.class);intent.putExtra("name", "zhangSan");startActivity(intent);//Main2Activity.javaLog.e("Log", getIntent().getStringExtra("name"));

经测试,当Main2Activity被非正常销毁并自动重建后,由MainActivity传递过来的Intent依然是存在的,也就是说在重建后的Main2Activity中仍然可以通过getIntent().getStringExtra(“name”)获取到数据。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 斜挎包肩带长了怎么办 3个月宝宝不吃奶怎么办 米饭扔厕所堵了怎么办 门过梁搭接不够怎么办 华为g7开不了机怎么办 警务通手机丢了怎么办 手机被伪基站覆盖怎么办 听了高频率声音怎么办 qq音乐签到没了怎么办 手机qq音乐不能播放怎么办 台式电脑放歌没有声音怎么办 微信图片上传大愎怎么办 行车记录仪内存卡丢了怎么办 投资项目失败lp的钱怎么办 无线网无ip分配怎么办 为什么电脑的暴风影音打不开怎么办 电枪充电板进水怎么办 捡到一颗子弹该怎么办 防弹衣只保护身体那手臂怎么办? 被子被宝宝尿湿怎么办 眼睛被子弹打了怎么办 gta5买了2套衣服怎么办 gta5车被摧毁了怎么办 gta5车被损坏了怎么办 头盔玻璃磨花了怎么办 浇花喷水壶坏了怎么办 电力专用光缆撞了怎么办 国防电缆挖断了怎么办 国防光缆挖断了怎么办 房门前乱挂光纤线影响住户怎么办 挂断低于限高的光缆怎么办 开大车挂住光缆怎么办 风把树枝挂断压到车该怎么办 货车柴油冻住了怎么办 尖头鞋老是折尖怎么办 打 氟氯西林疼怎么办 多余的十字绣线怎么办 硅胶类的东西沾到蓝药水怎么办? ph计斜率不到90怎么办 ph计斜率低于90怎么办 顾客说衣服起球怎么办