Activity的销毁分为两种情况:

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

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

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

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

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

protected void onRestoreInstanceState(Bundle savedInstanceState) {

if (mWindow != null) {

Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);

if (windowState != null) {

mWindow.restoreHierarchyState(windowState);

}

}

}

如果重写了onRestoreInstanceState并且为super Activity的onRestoreInstanceState,界面将不会恢复。

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

如果要存储额外的数据,必须覆写回调函数onSaveInstanceState(),注意super.onSaveInstanceState()。系统会在用户离开activity的时候调用这个函数,并且传递给它一个Bundle object,如果系统稍后需要重建这个activity实例,它会传递同一个Bundle object到onRestoreInstanceState() 和 onCreate() 方法中去。

1.jpg

当系统停止activity时,系统会调用onSaveInstanceState(),状态信息会以键值对的形式存储下来,程序可以在onSaveInstanceState保存自己想要保存的变量。

static final String STATE_SCORE = "playerScore";

static final String STATE_LEVEL = "playerLevel";

...

@Override

public void onSaveInstanceState(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);

}

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

在onCreate中,可以先检查是否Bundle是null,如果是null,则表明是要创建一个全新的对象,而不是重建一个上次被销毁的对象。

@Override

protected void onCreate(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

}

...

}

也可以选择在onRestoreInstanceState()中实现,这个函数在onStart()之后调用。只有在有数据要恢复的时候系统会调用onRestoreInstanceState()

public void onRestoreInstanceState(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 -- Activity的销毁和重建

    两种销毁 第一种是正常的销毁,比如用户按下Back按钮或者是activity自己调用了finish()方法: 另一种是由于activity处于stopped状态,并且它长期未被使用,或者前台的acti ...

  2. Android:销毁所有的Activity退出应用程序几种方式

    Android:销毁所有的Activity退出应用程序几种方式 author:DRC工作室 我们都知道,Activity是存放在栈中.在默认的情况下(standard)Activity在栈中是以先进后 ...

  3. java类安卓app 简介_android.app.Activity 的介绍

    文章可随意转载,但务必注明源地址 发现当前Android的资料不是很多,而且对于Activity的介绍也很少,所以把官方文档的android.app.Activity的介绍翻译了一下,加入了一些自己的 ...

  4. android activity跳转多次闪退_Android实现Activity和Fragment的跳转动画

    1.使用overridePendingTransition方法实现Activity跳转动画 botton_in <?xml version="1.0" encoding=&q ...

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

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

  6. activity 防止多次打开_Android开发Activity任务和返回栈

    任务是用户在执行某项工作时与之互动的一系列 Activity 的集合.这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中.例如,电子邮件应用可能有一个 Activity ...

  7. android activity生命周期_Android岗高频面试题合一集,看你能答出几题?

    前言 面试季黄金时期来袭,想必许多朋友在这时有找工作.换工作.跳槽涨薪等想法,但你们都有一个相同的过程那就是面试.大家肯定想知道面试时都问哪些面试相关问题,所以就去网上查找题去刷题,为了省去大家找题的 ...

  8. android 之Activity的五种传值方式 (在从当前Activity跳转到目标Activity时的传值方式)

    A.使用intent(意图)传值 MainActivity(源文件):         1.intent.putExtra(key,value):key一般是String,值为 java八大基本数据类 ...

  9. android activity横竖屏切换,Activity重新创建问题解决!

    activityA和B A跳转到B 1:在主配置文件中添加Bactivity,如果不想B在横竖屏切换的时候导致activity的销毁和重新创建;可在声明activity中添加 android:conf ...

  10. 透明主题activity和dialog对其他activity生命周期的影响

    1 activity的生命周期简单说明 首先上官网图片: //activity不同状态有不同的回调: public class ExampleActivity extends Activity {@O ...

最新文章

  1. Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
  2. 人民搜索,该怎么说你才好
  3. python第三方开发软件_python开发者的必备工具(一)
  4. flume学习(四):Flume Interceptors的使用
  5. 李开复从不缺席的AI夏令营开营:今年周志华俞勇张潼授课,1万人报名仅600入选...
  6. 简单dp ---HDU3485 Count 101
  7. createform用法_vue自定义表单生成器form-create使用详解
  8. debian关闭开机自动启动时候的gui
  9. Pyspark 最近使用的一些有趣姿势的梳理
  10. Pycharm远程链接矩池云报错踩坑记录
  11. 如何重启apache2服务
  12. UVALive 4725 Airport(二分)
  13. 物联网空开价格_北斗星C2物联网蒸箱集成灶618价格提前开抢,转发送豪礼
  14. 昆仑通态复制的程序可以用吗_MCGS昆仑通态触摸屏常见问题(5)
  15. 阿里巴巴矢量图标如何修改颜色,以及原理
  16. msys2+mingw64+ragel安装
  17. 2020 字节跳动,网易,华为(1),阿里P7级别面试经验总结
  18. 【Android】canScrollVertically和canScrollHorizontally
  19. php界面入门,web前端入门:一小时学会写页面 - 空酷狗
  20. XCTF-mobile app3

热门文章

  1. 数据分析与机器学习之线性回归与逻辑回归(六)
  2. 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
  3. 9-4-插值查找-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
  4. View组件之各xml属性
  5. Exponentially Weighted Moving-Average
  6. 添加鼠标悬浮在控件上的提示信息 很齐全各种方法 MFC ToolTipCtl
  7. java 通过 socket 实现 服务器和客户端的通信 TCP
  8. 未来软件开发的主流方向:规则引擎 (Rule Engine)
  9. 10 signs that you’re not cut out to be an IT manager
  10. 第九章:第九章:XML文档集成---Axd向导