Activity初识
Activity是Android系统API的一个类,用于提供一个系统与用户的交互机制。
简单来理解,Activity也可以理解为一个页面,可以获取对应的UI组件为之绑定响应的处理事件,即与人的交互。
每个Activity都需要继承自android.app.Activity,通过调用Activity类的setContentView()方法可以设置用户界面。
从一个界面跳到另一个界面,可通过Activity的startActivity()方法实现,传入一个Intent参数,该参数可用来进行数据传递。
Android系统采用栈的数据结构来管理一个程序的多个用户界面。
Activity状态
Activity有以下5种状态:
- started状态
Activity启动,并入栈,此时尚未在用户屏幕上将界面显示出来。
- running状态
界面在屏幕上显示出来,且位于最上层,获取用户输入焦点
- paused状态
界面被遮挡,但仍然可见,失去用户输入焦点
- stopped状态
界面被另一个Activity的界面遮挡,完全看不见,但仍然存活
- exited状态
Activity出栈,停止运行,且被释放掉
为了响应和处理Activity各个状态的变化,Activity类提供了7个回调方法,供开发者覆盖。当Activity的状态发生变化时,这7个方法中的若干方法会被调用进行相关的处理。这些方法如下:
Activity事件
- onCreate()方法
Activity启动后被调用,此时界面尚未显示出来,一般用于进行初始化的操作。该方法需要一个Bundle类型的参数,当方法被调用时由系统传入该参数
- onStart()方法
当Activity状态变为可见时被调用
- onResume()方法
当Activity获取用户焦点时被调用
- onPause()方法
当新的Activity启动,当前Activity失去用户焦点时被调用,此时用户界面仍然可见或部分可见。Activity被暂停后可能会被系统强制结束以释放内容空间,所以通常需要在此时保存程序的相关数据
- onStop()方法
当前用户空间被新的界面遮挡,完全不可见时调用。此时该Activity有可能会被系统强制结束以释放内存空间,因此需要在此时保存程序的相关数据
- onRestart()方法
当Activity从停止状态恢复时被调用,也就是说页面重新可见
- onDestroy()方法
当Activity释放时调用
Activity启动模式
之前我们提到过,Android通过一个task栈来管理多个Activity,而Activity的启动模式则决定是进入存在的栈还是进入新的栈。Activity的启动模式有如下几种:
- standard(标准模式)
默认的启动模式,每次激活Activity时都创建Activity实例,并放入任务栈中,即一个任务栈有可能有多个相同Activity类的实例
- singleTop模式
激活Activity时,如果当前栈顶是当前Activity,则不需要创建,如果不是,则创建一个实例
- singleTask模式
如果要激活的Activity在任务栈中存在该实例,则将之上的Activity实例全部出栈,让该Activity实例位于栈顶
- singleInstance模式
激活Activity时,创建实例放入另外的栈中,且该栈中只有一个Activity实例
Activity的启动模式可以通过在manifest主配置文件的Activity节点里增加android:launchMode=" .. "设置
Intent初识
刚才我们介绍过,不同的Activity之间通过startActivity方法相互调用,而该方法需要传入一个Intent对象。Android中利用Intent对象建立连接并实现组件通信的模式,称作意图机制。
Intent类是Android组件连接的核心,一个Intent对象是对某个需要处理的操作所进行的封装和抽象的描述。它可以用来打开Activity,在多个Activity之间传递数据,以及启动后台服务,与广播组件和后台服务交互等,集中体现了整个组件连接模型的设计思想。
Intent属性与过滤器
一个Intent包含6个方面的属性:action、data、category、type、component和extras,下面一一说明:
action属性描述Intent对象所要实施的动作,可以调用Intent.setAction()方法来指定,常见的action如下:
- ACTION_MAIN:表示整个程序的入口
- ACTION_VIEW:表示用于将一些数据显示给用户
- ACTION_EDIT:表示允许用户对一些数据做编辑
- ACTION_DIAL:表示打电话面板
- ACTION_CALL:表示直接拨打电话
- ACTION_SEND:表示发送短信
- ACTION_SENTO:表示选择发送短信
- ACTION_BATTERY_LOW:表示电量低广播
data属性描述Intent对象中用于进行操作时的数据,通过Intent.setData()或setDataAndType()设置
category属性描述Intent对象中的action属性属于哪个类别,也就是设置Intent对象进行某项操作时的约束,通过Intent.addCategory()设置
type属性用来描述组件能够处理的请求类型(即数据的MIME类型),通过Intent.setType()设置,可以使用通配符*表示所有类别
例如:image/* 表示所有图片
component属性描述Intent对象中所使用的组件类的名字,通过Intent.setComponent()方法利用类名进行设定,也可以通过Intent.setClass()方法设置。当调用组件明确时,就不再需要action,data等信息去寻找满足条件的组件。一旦指定Component,Intent对象就变成了单纯的信息载体,只负责传递消息和数据。
extras属性以Bundle类的形式存储其他额外需要的数据,以键值对形式存放,使用setExtras()设置
Intent使用
Intent使用有两种方式:显示和隐式
显示:创建时就指定所对应的Activity对象
隐式:创建时不指定Activity对象,而是指定action,category等信息,由Android系统根据这些属性信息来选择合适的Activity取运行。这种方式以弱耦合的方式将Intent和Activity关联起来,提供更大的灵活性。
在AndroidManifest.xml配置文件中写Activity配置的时候,可以添加该Activity的过滤器,通过<intent-filter>标签来指定该Activity过滤哪些Intent,可以配置多个过滤器
复杂类型的数据传递
在之前我们介绍了不同Activity之间的数据传递,可以通过Intent或者Bundle来传递一些基本类型数据,而对于对象等复杂类型,可以通过以下两种方式:
- Serilziable接口
- Parceable接口
数据回传
当一个Activity启动另一个Activity后,需要等第二个Activity关闭后将数据带回来,可以通过startActivityForResult(intent)方法来开启另一个Activity,这样等第二个Activity关闭时,会将数据传递回来。同时还需要重写第一个Activity的OnActivityResult()方法