Android的四大组件之Activity
Android的四大组件之Activity
Activity:是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。Activity提供一个屏幕,用户交互的界面。
“Activity (这个觉得没必要翻译,直接用还好理解 @ Sam )就提供与用户交互的界面,用户通过这个交互界面可以进行一些操作,比如打电话、照相、发邮件或查看地图。每一个 Activity 都提供了一个可以绘制用户交互界面的窗体,这个窗体通知充满整个屏幕,但也可以是小于屏幕或悬浮于其它窗体上。”---from: sam_zhang1984
Activity的生命周期:--------------------------------------------------------------------------------
onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->onDestroy()
说明:启动Activity时会先执行onCreate()--->onStart()--->onResume();
当该Activity被一个透明的界面或者不是全屏的界面覆盖时,由于此时该Activity仍然处于可见状态,所以,该Activity会执行onPause()方法进入暂停状态,此时重启该Activity时只需要执行onResume();
当该Activity被完全覆盖或者用户按下home键、锁屏等操作时,该Activity会执行onPause()--->onStop()方法,该Activity进入停止状态,此时重启Activity时需要执行onStart()--->onResume();
当处于onStop()或者onPause()状态的Activity由于内存不足或者其他因素,杀死该Activity,重启该Activity时则需要调用onCreate()--->onStart()--->onResume()。
Activity在横竖屏切换状态下声明周期的变化---------------------------------------------------------
运行Activity,onCreate()--->onStart()---->onResume();
竖屏切换成横屏时:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume();黄色阴影部分是竖屏状态下的Activity的生命周期变化。
横屏再切换到竖屏时:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()--->onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume();我们发现这里生命周期执行了两次,这当然不是我们希望的结果,那我们如何优化:
1、在AndroidManifest.xml中,对该Activity添加 android:configChanges="orientation",然后竖屏切换到横屏时生命周期变化:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume();
横屏切换到竖屏时:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()--->onConfigurationChanged();此时,会发现,生命周期并没有像之前那样执行两次,但是多执行了一个onConfigurationChanged()方法。
2、在AndroidManifest.xml中,对该Activity添加 android:configChanges="orientation|keyboardHidden",竖屏切换到横屏时,生命周期只执行:onConfigChanged()--->onConfigurationChanged();
横屏切换回竖屏时:onConfigurationChanged()--->onConfigurationChanged();
总结:
①不设置Activity的android:configChanges时,切屏回重新调用各个生命周期,竖屏切换成横屏时生命周期执行一次,横屏切换成竖屏时生命周期回执行两次。
②在AndroidManifest.xml中,对Activity添加 android:configChanges="orientation"时,切屏会执行生命周期,并且横竖屏切换都只会执行一次
③在AndroidManifest.xml中,对该Activity添加 android:configChanges="orientation|keyboardHidden",切屏时不会重新调用各个生命周期,只会执行onConfigurationChanged()方法
Activity的启动方式-------------------------------------------------------------------------------------
standard:Android默认的启动模式,每次都会创建新的Activity实例并push到任务栈中。可以有多个实例。
singleTop:单顶模式,也叫栈顶复用模式。启动某个Activity时,如果目标任务栈中存在该Activity实例并且位于栈顶时,就不会再创建新的Activity实例,而是直接使用栈顶的Activity。不位于栈顶则需要创建新的实例,可以有多个实例。
singleTask:单任务模式。整个任务栈中只会存在一个Activity实例。使用时,如果该Activity的实例已经存在且不在栈顶,则会销毁该Activity之上的所有Activity,直接使用该Activity。只有一个实例。
singleInstance:单例模式。跟singleTop很相似,区别是singleInstance模式下的Activity会创建一个新的任务栈,独立于当前的任务栈存在。
保存Activity的运行状态----------------------------------------------------------------------------------
Activity在暂停或者停止状态时,关于它的成员信息和当前状态都是存活的,所以可以保存Activity的状态。
当Activity销毁时,系统就无法恢复其状态,用户调用这个Activity时会创建一个新的Activity对象。这种情况下要保存Activity的状态就需要调用重写onSaveInstanceState()这个方法,该方法在Activity销毁前调用,并且会传进一个Bundle对象,可以使用Bundle对象的putString()之类的方法在Bundle对象中以键值对的形式保存状态信息。这个时候,即使Activity被销毁了,当你重新调用时会重新获取该Activity之前的状态。onSaveInstanceState()方法一般是在onStop之前onPause之后调用。
注:因为很多情况下是不需要保存 activity 的状态信息的(比如用户按了返回键就是想关闭当前 activity ),所以并不能保证在你的 activity 被销毁前一定会调用 onSaveInstanceState() 方法,因此我们应该只是用它来保存一些 activity 的转换过程状态(即 UI 的状态),而不能用来保存永久性数据。但是可以用 onPause 方法在用户离开 activity 时来保存永久性数据,比如需要保存到数据库的数据。
Android的四大组件之Activity的更多相关文章
- 从零开始学android开发-四大组件之一 Activity
1.Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的, ...
- android中四大组件之间相互通信
好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...
- Android的四大组件
Android的四大组件:Activity.Service.BroadcastReceiver.Content Provider. Content Provider 属于Android应用程序的组件之 ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)
如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com ...
- Android深入四大组件(五)Android8.0 根Activity启动过程(后篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- 【Android开发日记】之入门篇(四)——Android四大组件之Activity
在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...
随机推荐
- Razor Engine,实现代码生成器的又一件利器
Razor Engine,之前仅仅是ASP.NET MVC的一种View引擎,目前已经完全成为一种可以独立使用的模版引擎,并且已经成为了CodePlex上一个开源的项目(http://razoreng ...
- ZOJ Problem Set - 1331 Perfect Cubes 判断一个double是否为整数
zju对时间要求比较高,这就要求我们不能简单地暴力求解(三个循环搞定),就要换个思路:因为在循环时,已知a,确定b,c,d,在外重两层循环中已经给定了b和c,我们就不用遍历d,我们可以利用d^3=a^ ...
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...
- java.util.ConcurrentModificationException异常处理
ConcurrentModificationException异常处理 ConcurrentModificationException异常是Iterator遍历ArrayList或者HashMap数组 ...
- 如何让你的网站支持https
如何让你的网站支持https 当今世界的主流网站基本都是使用https对外界提供服务,甚至有某些公司建议完全使用https, 那么https是什么呢?请参考如下的图解,https是在我们通常说的tcp ...
- Sql Server函数全解(一)字符串函数
字符串函数用于对字符和二进制字符进行各种操作 1.ASCII()函数 ASCII(character_expression)函数用于返回字符串表达式中最左侧的ASCII代码值.参数character ...
- 花几分钟搭建一个自已的GIT服务器
安装软件: 1.下载GIT服务 For Windows 64 https://git-scm.com/download/win 选中所有功能默认安装便可 2.下载GOGS服务 GOGS具有GITHU ...
- react入门(5)
对前面四篇内容进行简单的回顾: react入门(1):jsx,组件,css写法 react入门(2):事件,this.props.children,props,...other,map循环 react ...
- C# EPL USB 指令打印
private void btnPrinter_Click(object sender, EventArgs e) { #region ESC 热敏图像点阵像素点读取打印 //Bitmap bitma ...
- angular.js写法不规范导致错误
以下写法:没有明确指定module和controller,写法不规范. 更改angular.js版本会出bug. <html ng-app> <head> <title& ...