activity直接销毁_Android -- Activity的销毁和重建
两种销毁
第一种是正常的销毁,比如用户按下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的销毁和重建相关推荐
- activity销毁时执行执行方法是_[Android开发 VIII ]销毁一个activity
销毁一个activity一共有两种方法,一种是按下返回键,就可以销毁当前activity:还有一种方法就是通过代码的方式,Android提供了finish()这个方法,调用这个方法也可以完成销毁一个a ...
- activity 启动模式_Android世界:Activity的启动模式及其适用范围
一.Activity启动模式简介 activity启动模式,可以理解为activity在任务栈(也叫"回退栈")的回退规则,即点击"back"键时,activi ...
- mvp关联activity生命周期_Android MVP架构从入门到精通-真枪实弹
Android MVP架构从入门到精通-真枪实弹 一. 前言 你是否遇到过Activity/Fragment中成百上千行代码,完全无法维护,看着头疼? 你是否遇到过因后台接口还未写而你不能先写代码逻辑 ...
- 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- android activity 回调函数,Android Activity的生命周期
Activity的生命周期 Android系统根据activity的所处不同阶段对应的唤起其特定的回调函数来执行代码.activity的一系列有序的生命周期回调函数.本文将来讨论下activity各阶 ...
- 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。...
两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...
- android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]
1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...
- Activity(三)—— Activity的启动模式
Activity的启动模式 1 Activity的LaunchMode Activity为什么需要启动模式?在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们一一放入 ...
- Activity(二)—— Activity的生命周期
Activity的生命周期 1 android任务栈/Task Android中的Activity是可以层叠的.每启动一个新的Activity,就会覆盖在原Activity之上,然后点击Back键会销 ...
最新文章
- HTML页面中使两个div并排显示
- Post与Get传值读取方法
- select 实现类似多线程_linux进程通信--socket套接字(四)--多路IO转实现一个server对应多个client...
- MarkDown常用语法及word转MarkDown
- [ArcPy百科]第一节:何为arcpy
- 高等数学常用极限求法总结(无详解)
- 成语接龙 | c++ | 建图和BFS
- 最强PostMan使用教程(7)postman做数字签名认证
- 阙值,阈值,阀值,傻傻分不清
- xp重启计算机的快捷键,xp电脑关机重启快捷键如何使用
- 能力与爱好 我能熟练使用计算机,关于2020大学生简历自我评价精选5篇(心选优品)...
- pandownload网页版服务器维护中,PanDownload网页版源码
- MAC欺骗-通过思科模拟器实现
- 价值7000万的商业模式,羊毛出在狗身上,猪来买单
- 改造Kindeditor之:自定义图片上传插件。 外加给图片增加水印效果的选择。
- 烧录flash_烧录固件完成后,配置JFLASH让程序自动运行
- 00.关于Android开发的任务分工
- oracle计算6的阶乘,oracle 求阶乘
- JavaScript报错BigNumber overflow解决方法代码
- 模拟360导航的钢琴效果实现
热门文章
- 3皮卡丘眨眼代码_活见久,皮卡丘居然是一门编程语言
- mac svn工具_程序员或产品经理,这些Mac的效率工具一定不要错过
- linux 查看端口 程序,linux开发:Linux下查看端口占用
- python函数和模块的使用方法_Python学习06_函数和模块的使用
- 协议转换器的特点有哪些?
- HDMI高清光端机产品介绍
- 【渝粤教育】广东开放大学 机械制造基础 形成性考核 (55)
- 【渝粤题库】陕西师范大学210015幼儿园社会教育作业(高起专)
- 【应用】如何更好的简化工业现场采集控制?
- hadoop可以解决什么问题_快速解决皮带机轴磨损问题可以这样做