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的更多相关文章

  1. 从零开始学android开发-四大组件之一 Activity

    1.Activity是Android四大组件(Application Components)之一,简单来说Activity就是平常所见到的用户界面,一般情况下,一个Activity所占的窗口是满屏的, ...

  2. android中四大组件之间相互通信

    好久没有写有关android有关的博客了,今天主要来谈一谈android中四大组件.首先,接触android的人,都应该知道android中有四大组件,activity,service,broadca ...

  3. Android的四大组件

    Android的四大组件:Activity.Service.BroadcastReceiver.Content Provider. Content Provider 属于Android应用程序的组件之 ...

  4. Android四大组件之Activity(活动)及其布局的创建与加载布局

    Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...

  5. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  6. Android四大组件之——Activity的开启:StartActivity()和StartActivityForResult()(图文详解)

                如需转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com   ...

  7. Android深入四大组件(五)Android8.0 根Activity启动过程(后篇)

    前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...

  8. Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)

    前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...

  9. 【Android开发日记】之入门篇(四)——Android四大组件之Activity

    在Android中,无论是开发者还是用户,接触最多的就算是Activity.它是Android中最复杂.最核心的组件.Activity组件是负责与用户进行交互的组件,它的设计理念在很多方面都和Web页 ...

随机推荐

  1. ASP.NET WebAPi之断点续传下载(上)

    前言 之前一直感觉断点续传比较神秘,于是想去一探究竟,不知从何入手,以为就写写逻辑就行,结果搜索一番,还得了解相关http协议知识,又花了许久功夫去看http协议中有关断点续传知识,有时候发觉东西只有 ...

  2. AngularJS之Filter(二)

    前言 本节我们来讲讲AngularJS中主要的部分之一,那就是过滤器,当从后台获取到的数据呈现到视图上时,此时可能需要对数据进行相应的转换,此时我们可以通过过滤器在不同页面进行不同数据的格式抓换,在A ...

  3. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

  4. Objective-C中的集合类

    下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习. 在Obj ...

  5. MyCAT实现MySQL的读写分离

    在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修 ...

  6. 重温Servlet学习笔记--session对象

    session的类型是属于HttpSession,HttpSession是由javaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端. HttpSession是servle ...

  7. 简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 通过GeoServer发布的服务,在GeoServer内部有 ...

  8. ASP.NET实现微信功能(2)(服务号高级群发)

    前面写了一篇文章,关于微信的:http://www.cnblogs.com/kmsfan/p/4047097.html 今天打算来写本系列的第二批文章,服务号后台群发. 在写本篇文章之前,我们先来看看 ...

  9. PHP封装

       封装 把成员方法和成员属性封装到类中,隐藏属性和方法实现的细节,通过public.protected.private等限定类成员的访问权限,数据被保护在内部,只通过被授权的成员方法才可以操作,尽 ...

  10. Struts2 源码分析——调结者(Dispatcher)之action请求

    章节简言 上一章笔者讲到关于struts2启动的时候加载对应的准备工作.如加载配置文件struts.xml之类的信息.而相应的这些操作都离不开Dispatcher类的帮助.如果读者只是认为Dispat ...