用户和系统触发­的事件,可能造成一个activity状体的改变。这个文档描述了一些常见的情况,和如何去处理这些改变。

原网站:https://developer.android.google.cn/guide/components/activities/state-changes

这篇文章包括:

                    配置改变发生,

                    处理多窗口实例,

                    Activity或者dialog显示在前端(foreground),

                    当用户按下back键,

                    系统杀死app进程

1.  配置改变发生

有一些事件可以触发配置的改变。最经典的莫过于手机方向的变化。改变语言或者输入设备也会改变配置。

当配置改变发生时,activity先辈毁灭,然后再被创建。原activity会依次调用onPause(),onStop(),onDestory()回调方法。一个新的activity然后被创建,一次会调用onCreate(),onStart(),onResume()方法

在配置变化的过程中,使用viewModel,onSaveInstanceState,当地存储 共同去保存activity的UI状态。决定如何去结合使用这些方法,依赖于你的UI数据,app的用例,和检索速度与内存使用的考虑。

关于更多的信息,可以看https://developer.android.google.cn/guide/components/activities/activity-lifecycle.html

ViewModel可以帮助你管理生命周期,可以看https://developer.android.google.cn/topic/libraries/architecture/viewmodel.html了解更多

2. 处理多窗口实例

当app进入多窗口模式模式,在android7.0(api level 24)版本或者更高版本可以使用,系统会通知当前activity配置发生改变,使用上述步骤调用生命周期方法。如果已经处于多窗口模式,调整边界大小也会引发配置改变。

更多处理多窗口生命周期方法可以看https://developer.android.google.cn/guide/topics/ui/multi-window.html

在多窗口模式中,尽管有多个app显示,只有一个app是获得焦点能够和用户 交互的。可以交互的app处于运行状态,另外的处于暂停状态。

当用户从当前app跳转到另一个app,系统会调用onPause方法对当前app,对另一个app调用onResume方法。

3. Activity或者dialog显示在前端(foreground)

如果一个新的activity或者dialog显示在前端,获取焦点并且部分显示在当前activity的前面。被覆盖的activity会丧失焦点进入暂停 状态。

当被覆盖的activity返回到前端再次获取焦点,会调用onResume方法

如果完全覆盖,会调用onPause和onStop方法。

当完全被覆盖的同一个activity实例返回到前端时,会调用onRestart,onStart,onResume方法。

当完全被覆盖的一个新的activity实例返回到前端时,对调用onStart,onResume

注意:用户按下button和完全覆盖的表现一样。

4. 当用户按下back键

如果用户按下back键,activity会经历onPause,onStop,onDestory方法。除了被毁灭外,这个activity还会从栈中被移除.

这是十分重要的去注意,在这种情况下,onSaveInstanceState方法不会被调用。这是基于一个假设,用户按下返回键不会再次返回。但是,你可以重写onBackPressed方法去实现一些定制的行为,例如一个confirm-quit dialog。

如果你重写这个方法,推荐在你重写的方法中调用super.onBackPressed

方法,否则当用户按下back按钮时,可能会有感到不友好的感觉。

5. 系统杀死app进程

如果app在前端运行,系统需要为他获取更多的内存,处于后台的app可能会被杀死释放内存。

关于更多https://developer.android.google.cn/guide/components/activities/activity-lifecycle.html#asem

https://developer.android.google.cn/guide/components/activities/activity-lifecycle.html#saras

当activity改变时,我们如何处理它的更多相关文章

  1. Android开发——异步任务中Activity销毁时的问题

    0.  前言 在Android开发中经常会发生Activity的销毁重建,比如用户长时间接听一个电话后回到APP.在Android开发--Fragment知识整理(二)中我们提到了使用Fragment ...

  2. Android中Activity运行时屏幕方向与显示方式详解

    现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...

  3. Activity系列讲解---Activity运行时的屏幕方向,全屏,窗体模式的设置

    Android内置了方向感应器的支持.Android会根据所处的方向自动在竖屏与横屏间切换.但是有的应用程序只能在横/竖屏时运行,比如某些游戏,此时我们要锁定该Activity运行时的屏幕方向,< ...

  4. EditText设置文字改变时的监听

    textWatcher = new TextChangeWatcher(); etQuerryInfo.addTextChangedListener(textWatcher); /** * 文字改变类 ...

  5. activity切换时的overridePendingTransition动画效 (转)

    注意,切换方法overridePendingTransition只能在startActivity和finish方法之后调用.第一个参数为第一个Activity离开时的动画,第二参数为所进入的Activ ...

  6. activity切换时的overridePendingTransition动画效

      注意,切换方法overridePendingTransition只能在startActivity和finish方法之后调用.第一个参数为第一个Activity离开时的动画,第二参数为所进入的Act ...

  7. 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

    五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...

  8. javascript实现浏览器窗口大小被改变时触发事件的方法

    转载 当浏览器的窗口大小被改变时触发的事件window.onresize 为事件指定代码: 复制代码代码如下: window.onresize = function(){ } 例如: 浏览器可见区域信 ...

  9. WdatePicker日历添加事件,在任意月改变时处理日期事件

    原由 在做系统时根据要求有时候需要屏蔽掉某些特殊的日期,像周日或者法定假日,以及一些调班的日期:使用WdatePicker可以屏蔽掉周日和大多数法定假日,但像清明或者调班的日期则不好处理. 想法 1: ...

随机推荐

  1. django —— 邮件

    官方文档 1.11 配置settings.py # QQ邮箱为例, 其他邮箱对应的SMTP配置可查官方 EMAIL_HOST = "smtp.qq.com" EMAIL_PORT ...

  2. VS2010使用Release进行调试的三个必须设置选项

    How to: Debug a Release Build You can debug a release build of an application. To debug a release bu ...

  3. 【爬坑】运行 Hadoop 的 MapReduce 示例卡住了

    1. 问题说明 在以伪分布式模式运行 Hadoop 自带的 MapReduce 示例,卡在了 Running job ,如图所示 2. 解决过程 查看日志没得到有用的信息 再次确认配置信息没有错误信息 ...

  4. 【转】Java学习---解析Java Servlet工作过程

    [原文]https://www.toutiao.com/i6594316694657696264/ 解析Java Servlet工作过程 Servlet简介 Servlet是sun公司提供的一门用于开 ...

  5. Iterator迭代器对象

    目录: >迭代器Iterator的使用 >迭代字符串集合 >迭代对象集合 >迭代器使用图解,和原理分析 >Java迭代器源代码 >迭代器Iterator的使用: & ...

  6. Django商城项目笔记No.5用户部分-注册接口-短信验证码

    Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...

  7. Windows2008 Server r2 64位显示桌面图标的方法

    点击桌面左下方的开始菜单,在搜索框中输入“icon”,如下图所示: 点击:显示或隐藏桌面上的通用图标,然后弹出如下图: 应用并确定即可!

  8. saxbuilder用法

    xml为我们在网络交换数据带来很大方便,在java中可以使用saxbuilder来操作xml格式文件,下面介绍一下saxbuilder的常用方法. import org.jdom.Document; ...

  9. cocos2d-x2.2.3学习

    cocos2d-x2.2.3抛弃了原先的vs模板,改为python创建项目,详细什么原因我不是非常清楚啊,可能更方便些吧. 毕竟用pythone能够一下子创建很多不同平台的项目,让项目移植更方便些.可 ...

  10. Volley源码分析(四)NetWork与ResponseDelivery工作原理

    这篇文章主要分析网络请求和结果交付的过程. NetWork工作原理 之前已经说到通过mNetWork.performRequest()方法来得到NetResponse,看一下该方法具体的执行流程,pe ...