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页 ...
随机推荐
- HTTP的长连接和短连接——Node上的测试
本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket. 关键字:长连接.短连 ...
- DOM-Element类型
Element类型 Element类型用于表现XML或HTML元素,提供了对元素标签名.子节点及特性的访问.Element节点具有以下特征: nodeType的值为1 nodeName的值为元素的标签 ...
- 精确率与召回率,RoC曲线与PR曲线
在机器学习的算法评估中,尤其是分类算法评估中,我们经常听到精确率(precision)与召回率(recall),RoC曲线与PR曲线这些概念,那这些概念到底有什么用处呢? 首先,我们需要搞清楚几个拗口 ...
- 最详细的网站改版SEO优化指南:如何让排名不降反升
我知道,网站改版很是让人头疼.首先,这个过程需要很长时间还有大量工作要做,并且通常结果不会如你的预期.其次,改版确实有破坏之前为 SEO 所做努力的风险. 但不要因为通常网站改版带来排名下降就认为这是 ...
- M端总结
最近在项目开发过程中涉及到了移动端,现在对此进行总结. 在此次M端的开发过程中,遇到了许多问题,在此进行一次总结,希望大家在以后的开发过程中能尽量规避类似的问题,提高开发效率和代码质量.一.布局1.移 ...
- Azure Application Gateway (3) 设置URL路由
<Windows Azure Platform 系列文章目录> 在之前的文章中,笔者介绍了Azure Web App可以设置URL路由.如下图: 在这里笔者简单介绍一下,首先我们还是创建以 ...
- MySQL学习(二)SQL语句的总结
1.连接查询和关联查询连接查询:把两个表中相同的元素的连接就可以查询,使用:where里,select table1.*,table2.* from table1,table2 where table ...
- Kafka到Hdfs的数据Pipeline整理
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 找时间总结整理了下数据从Kafka到Hdfs的一些pipeline,如下 1> Kafka ...
- 自定义angularjs分页控件
继昨天写了knockoutjs+ jquery pagination+asp.net web Api 实现无刷新列表页 ,正好最近刚学习angularjs ,故琢磨着写一个angularjs版本的分页 ...
- 用浏览器(支持WebSocket)和node-inspector 调试后端(CoffeeScript,Typescript)代码
调试效果 配置 npm安装node-inspector: $ npm install -g node-inspector 配置gulp,gulp可以用 gulp-node-inspector 或 用g ...