Activity详解
来源:互联网 发布:天龙八部有挂机软件 编辑:程序博客网 时间:2024/05/18 03:00
一、简介
Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
在一个android应用中,一个Activity通常就是一个单独的屏幕,,但也可小于屏幕并浮动在其他窗口之上。
它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。
一个应用通常由多个彼此松散联系的 Activity 组成。每次新 Activity 启动时,前一 Activity 便会停止,但系统会在堆栈(“返回栈”)中保留该 Activity。 当新 Activity 启动时,系统会将其推送到返回栈顶,并取得用户焦点。 返回栈遵循“后进先出”堆栈机制,因此,当用户完成当前 Activity 并按“返回”按钮时,系统会从栈顶将其弹出(并销毁),然后恢复前一 Activity。
二、Activity生命周期
基本状态
- Active/Running
一个新 Activity 启动入栈后,它显示在屏幕最前端,处理是处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。 - Paused
当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。 - Stopped
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
- Active/Running
生命周期方法
onCreate(), 当Activity被创建时调用。可以在此方法里做一些初始化的工作,加载布局,绑定事件等。
onStart(), 当Activity可见但是还不能交互时调用
onResume(), 当Activity已获取焦点,用户既可见又可交互时调用
onPause(),当Activity失去焦点,用户不能交互但是仍可见,此方法会停留时间很短,所以不要在此方法中做耗时的清理工作。
onStop(), 当Activity不可见也不可交互时,
onDestroy(), Activity被销毁,可在此方法里做一些最终的回收和资源释放的工作。
onRestart(),当Activity没有被销毁,重新创建时。不同情况下生命周期方法的调用
最简单的创建过程: onCreate(),onStart(), onResume().打开一个Activity
最简单的销毁过程 : onPause(), onStop(), onDestroy(). 按Back键关闭刚打开的这个Activity
按Home键退出:onPause(), onStop().
跳转到新的Activity: onPause(), onCreate(), onResume(),onStop() .
4.Activity保存状态和创建时获取状态
当我们的程序Activity异常销毁时,那么savaInstanceState()就会调用。我们需要在此方法中,将需要重新创建时恢复的数据存入参数Bundle中。
- 保存状态
protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); String SaveData = "We must save the info"; String key = "SaveInfo"; outState.putString(key, SaveData); }
- 获取状态
与之相对应的是onRestoreInstanceState()方法,不过onCreate()中也可以获取保存的Bundle,不过onCreate()使用时需要进行参数Bundle的非空判断.
5.针对横竖屏切换
在AndroidManifests.xml文件,的Activity属性中添加如下代码,横竖屏切换时不会重新调用生命周期方法。只会执行onConfigurationChanged方法,横屏一次,竖屏两次。
android:configChanges="orientation | keyboardHidden | screenSize"
三、任务栈/Activity的启动模式
任务栈后进先出,先进后出。正常情况,打开一个Activity,放到栈顶。
1.四种启动模式
- standard 标准模式,默认的启动模式。 在这种模式下启动的Activity可以被多次实例化,即在同一个任务栈中可以存在多个同一个Activity实例。
- singleTop 单一顶部模式,顶部Activity不会重复。如果Activity的实例已经在任务栈的栈顶,那么再启动这个Activity的时候,不会再创建新的实例,而是重用位于栈顶的那个实例。
- singleTask 单一任务栈模式,干掉头上的其他Activity。在一个任务栈中只能有一个该Activity的实例,如果已经存在Activity,系统会销毁处在改Activity之上的所有Activity,最终让改Activity实例处于栈顶。
- singleInstance 单一实例(单例),任务栈里面自已一个人。设置了改模式的Activity会在一个独立的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说改实例启动的其他Activity会自动运行在另一个任务中。当再次启动该Activity实例时,会重用已存在的任务和实例。
2.如何指定任务栈的启动模式
2.1 manifest指定
比如我们要指定为singleTask模式
manifest里面的Activity有个 launchMode属性来制定启动模式:
<activity android:name=".SecondActivity" android:launchMode="singleTask" />
2.2 代码指定 intent.addFlag
比如我们要指定为singleTop模式
Intent intent = new Intent();intent.setClass(FirstActivity.this,SecondActivity.class);// 通过Intent的addFlag指定intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);startActivity(intent);
2.3、两种方式的对比
1、从优先级来说,代码指定优先于manifest指定
2、两者各有局限,
manifest无法设定 FLAG_ACTIVITY_CLEAR_TOP 标识
代码指定无法指定为 singleInstance启动模式
参考网址:http://www.jianshu.com/p/33d0a0abd990,阿敏其人(简书作者)
- Activity 详解
- Activity 详解
- Activity 详解
- Activity详解
- 详解activity
- Activity详解
- Activity详解
- activity详解
- activity详解
- Activity详解
- Activity详解
- Activity详解
- Activity详解
- Activity详解
- activity详解
- Activity详解
- 详解Activity
- Activity详解
- Activity生命周期分析
- 简单的确认操作对话框
- git基本命令
- 初识OPNENT(一)
- {分享}《关于0.9999….=1的证明》
- Activity详解
- 字符串相关
- 计蒜客挑战难题:单独的数字
- Scala学习第十六弹 元组
- IOS中音效播放
- Android 项目开发填坑记 - 使用 MultiDex 解决 64K 限制
- Ant 脚本 多渠道打包
- SerialPort类
- 鼠标持续点击