两种销毁

第一种是正常的销毁,比如用户按下Back按钮或者是activity自己调用了finish()方法;

另一种是由于activity处于stopped状态,并且它长期未被使用,或者前台的activity需要更多的资源,这些情况下系统就会关闭后台的进程,以恢复一些内存。

需要注意的是这其中有一种情况就是屏幕旋转的问题,当用户旋转手机屏幕,每一次都会导致activity的销毁和重新建立。

在第二种情况下,尽管实际的activity实例已经被销毁,但是系统仍然记得它的存在,当用户返回到它的时候,系统会创建出一个新的实例来代替它,这里需要利用旧实例被销毁时候存下来的数据。这些数据被称为“instance state”,是一个存在Bundle对象中的键值对集合。

缺省状态下,系统会把每一个View对象保存起来(比如EditText对象中的文本,ListView中的滚动条位置等),即如果activity实例被销毁和重建,那么不需要你编码,layout状态会恢复到前次状态。

但是如果你的activity需要恢复更多的信息,比如成员变量信息,则需要自己动手写了。

onSaveInstanceState()

如果要存储额外的数据,必须覆写回调函数onSaveInstanceState().

系统会在用户离开activity的时候调用这个函数,并且传递给它一个Bundle object,如果系统稍后需要重建这个activity实例,它会传递同一个Bundle object到onRestoreInstanceState() 和 onCreate() 方法中去。

当系统停止activity时,它会调用onSaveInstanceState()(过程1),如果activity被销毁了,但是需要创建同样的实例,系统会把过程1中的状态数据传给onCreate()和onRestoreInstanceState()(图中标出的2和3)。

存储Activity状态

当系统停止activity时,系统会调用onSaveInstanceState(),状态信息会以键值对的形式存储下来。

默认的实现中存储了activity的view系列的状态,比如文本和滚动条位置等。

要存储额外的信息,必须自己实现onSaveInstanceState(),并且给Bundle object加上键值对。

static final String STATE_SCORE = "playerScore";static final String STATE_LEVEL = "playerLevel";

...

@Overridepublic voidonSaveInstanceState(Bundle savedInstanceState) {//Save the user's current game state

savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);//Always call the superclass so it can save the view hierarchy state

super.onSaveInstanceState(savedInstanceState);

}

要记得调用基类的实现,以实现默认的实现。

恢复Activity状态

当activity重建时,需要根据Bundle中的状态信息数据恢复activity。onCreate() 和onRestoreInstanceState()回调函数都会接收到这个Bundle。

因为每次创建新的activity实例的或重建一个实例的时候都会调用onCreate()方法,所以必须先检查是否Bundle是null,如果是null,则表明是要创建一个全新的对象,而不是重建一个上次被销毁的对象。

比如onCreate()方法可以这么写:

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); //Always call the superclass first//Check whether we're recreating a previously destroyed instance

if (savedInstanceState != null) {//Restore value of members from saved state

mCurrentScore =savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel=savedInstanceState.getInt(STATE_LEVEL);

}else{//Probably initialize members with default values for a new instance

}

...

}

除了在onCreate()中恢复状态外,也可以选择在onRestoreInstanceState()中实现,这个函数在onStart()之后调用。

只有在有数据要恢复的时候系统会调用onRestoreInstanceState(),所以不必检查Bundle是否为null。

public voidonRestoreInstanceState(Bundle savedInstanceState) {//Always call the superclass so it can restore the view hierarchy

super.onRestoreInstanceState(savedInstanceState);//Restore state members from saved instance

mCurrentScore =savedInstanceState.getInt(STATE_SCORE);

mCurrentLevel=savedInstanceState.getInt(STATE_LEVEL);

}

此处也要注意,不要忘记调用基类实现。

我是天王盖地虎的分割线

activity直接销毁_Android -- Activity的销毁和重建相关推荐

  1. activity销毁时执行执行方法是_[Android开发 VIII ]销毁一个activity

    销毁一个activity一共有两种方法,一种是按下返回键,就可以销毁当前activity:还有一种方法就是通过代码的方式,Android提供了finish()这个方法,调用这个方法也可以完成销毁一个a ...

  2. activity 启动模式_Android世界:Activity的启动模式及其适用范围

    一.Activity启动模式简介 activity启动模式,可以理解为activity在任务栈(也叫"回退栈")的回退规则,即点击"back"键时,activi ...

  3. mvp关联activity生命周期_Android MVP架构从入门到精通-真枪实弹

    Android MVP架构从入门到精通-真枪实弹 一. 前言 你是否遇到过Activity/Fragment中成百上千行代码,完全无法维护,看着头疼? 你是否遇到过因后台接口还未写而你不能先写代码逻辑 ...

  4. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  5. android activity 回调函数,Android Activity的生命周期

    Activity的生命周期 Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码.activity的一系列有序的生命周期回调函数.本文将来讨论下activity各阶 ...

  6. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。...

    两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...

  7. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]

    1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...

  8. Activity(三)—— Activity的启动模式

    Activity的启动模式 1 Activity的LaunchMode Activity为什么需要启动模式?在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们一一放入 ...

  9. Activity(二)—— Activity的生命周期

    Activity的生命周期 1 android任务栈/Task Android中的Activity是可以层叠的.每启动一个新的Activity,就会覆盖在原Activity之上,然后点击Back键会销 ...

最新文章

  1. HTML页面中使两个div并排显示
  2. Post与Get传值读取方法
  3. select 实现类似多线程_linux进程通信--socket套接字(四)--多路IO转实现一个server对应多个client...
  4. MarkDown常用语法及word转MarkDown
  5. [ArcPy百科]第一节:何为arcpy
  6. 高等数学常用极限求法总结(无详解)
  7. 成语接龙 | c++ | 建图和BFS
  8. 最强PostMan使用教程(7)postman做数字签名认证
  9. 阙值,阈值,阀值,傻傻分不清
  10. xp重启计算机的快捷键,xp电脑关机重启快捷键如何使用
  11. 能力与爱好 我能熟练使用计算机,关于2020大学生简历自我评价精选5篇(心选优品)...
  12. pandownload网页版服务器维护中,PanDownload网页版源码
  13. MAC欺骗-通过思科模拟器实现
  14. 价值7000万的商业模式,羊毛出在狗身上,猪来买单
  15. 改造Kindeditor之:自定义图片上传插件。 外加给图片增加水印效果的选择。
  16. 烧录flash_烧录固件完成后,配置JFLASH让程序自动运行
  17. 00.关于Android开发的任务分工
  18. oracle计算6的阶乘,oracle 求阶乘
  19. JavaScript报错BigNumber overflow解决方法代码
  20. 模拟360导航的钢琴效果实现

热门文章

  1. 3皮卡丘眨眼代码_活见久,皮卡丘居然是一门编程语言
  2. mac svn工具_程序员或产品经理,这些Mac的效率工具一定不要错过
  3. linux 查看端口 程序,linux开发:Linux下查看端口占用
  4. python函数和模块的使用方法_Python学习06_函数和模块的使用
  5. 协议转换器的特点有哪些?
  6. HDMI高清光端机产品介绍
  7. 【渝粤教育】广东开放大学 机械制造基础 形成性考核 (55)
  8. 【渝粤题库】陕西师范大学210015幼儿园社会教育作业(高起专)
  9. 【应用】如何更好的简化工业现场采集控制?
  10. hadoop可以解决什么问题_快速解决皮带机轴磨损问题可以这样做