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页 ...
随机推荐
- JMM和happens-before原则
JMM: Java Memory Model(Java内存模型),围绕着在并发过程中如何处理可见性.原子性.有序性这三个特性而建立的模型. 可见性: JMM提供了volatile变量定义.final. ...
- EntityFramework 7.0之初探【基于VS 2015】(十)
前言 本篇作为EF 7.0的开篇也是Entity Framework目前系列末篇,因为关于EF 7.0学习资料实在是太少,我都是参考老外的资料花费了不少时间去研究去尝试同时也失败多次,个人觉得那是值得 ...
- Objective-C中的深拷贝和浅拷贝
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...
- iOS 网易新闻用到的框架
网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务 ...
- 原生JS实现jquery的链式编程。
这是我根据之前遇到的一个面试题,题目:用原生JS实现$("#ct").on("click",fn).attr("id"). 然后看了篇jqu ...
- 相克军_Oracle体系_随堂笔记007-PGA
实际工作中,Oracle中有两个很重要:Server Process 和 PGA. PGA内存作用和构成 1.PGA作用 2.PGA构成 1)private SQL area 2)Sess ...
- TF-IDF提取行业关键词
1. TF-IDF简介 TF-IDF(Term Frequency/Inverse Document Frequency)是信息检索领域非常重要的搜索词重要性度量:用以衡量一个关键词\(w\)对于查询 ...
- 从零开始学 Java - 我放弃了 .NET ?
这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...
- C# 热敏打印机 Socket 网络链接 打印 图片 (二)
IPAddress ip = IPAddress.Parse("192.168.1.212"); IPEndPoint iport = );//9100为小票打印机指定端口 Soc ...
- using 的三种用法
using 有哪三种用法? 1)引入命名空间. 2)给命名空间或者类型起别名. 3)划定作用域.自动释放资源,使用该方法的类型必须实现了 System.IDisposable接口,当对象脱离作用域之后 ...