Activity的生命周期是指Activity从创建到销毁的整个过程,这个过程大致可以分为五种状态,分别是:启动状态,运行状态,暂停状态,停止状态和销毁状态。
- 启动状态:时间很短,一般启动之后就会进入运行状态
- 运行状态:此时的activity位于界面的最前端,是可见的,是可以和用户进行交互的
- 暂停状态:在某些情况下,activity对于用户来说仍然是可见的,但是他无法获取焦点,用户对他操作没有响应。比如,当前的activity上面覆盖了一个非全屏的界面的时候,被覆盖的activity就处于暂停状态
- 停止状态:当activity完全不可见时,就处于停止状态,此时很容易被系统销毁
- 销毁状态:在这个状态时,activity将会被清理出内存
生命周期方法
由图上可以看出一个Activity的生命周期方法有七个,分别是:
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
了解这些生命周期,可以帮助我们完成一些初始化,或者保存数据之类的操作,也可以向控制台打印一些日志,方便我们进行调试
下面简要介绍一下每一个方法都是在什么时候被调用的,他们的作用是什么:
- onCreate()
- create是创建的意思,他是一个activity生命周期经历的第一个方法
- 作用:用于activity一些初始化工作,比如加载布局
- 此时的activity是处于不可见的状态,所以一些加载初始化代码不应该被放到这个里面
- onStart()
- start是开始的意思
- 此时的activity处于即将可以看见的状态
- onResume()
- resume是继续,重新开始的意思
- 经历了前两个方法后,此时的activity已经具备了展现给用户的能力
- 在这个阶段,activity就已经在前台显示了,可以和用户进行交互了
- onPause()
- pause是暂停的意思,在当前activity被其他的activity覆盖或者屏幕锁屏时调用
- 此时的activity还是可以被用户看见的,我们可以在这个方法中去做一些轻量级的存储数据的操作
- onStop()
- stop是停止的意思
- 此时的activity已经不可见了,但是activity的对象还存在在内存当中,并没有被销毁
- onDestroy()
- destroy是销毁,消灭的意思
- 在activity被销毁的时候调用,在这个方法中,我们可以将一些没有释放的资源释放,以及进行一些回收工作
- onRestart()
- restart是从新开始的意思
- 是activity从停止状态到再次启动的时候调用
注意:当两个activity进行切换的时候,要知道调用的顺序
(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop
Activity之间的跳转和数据传递
首先需要介绍一个类:Intent
Intent
- intent是意图的意思,是程序中各组件进行交互的一种重要方式,他不仅可以指定当前组件要执行的动作,还可以在不同的组件之间互相传递数据。
- 显示Intent
- 显示Intent是指直接指定目标组件,比如activity跳转使用显示Intent代码为
Intent intent = new Intent(this,BActivity.class);
startActivity(intent);
- 创建Intent对象是传入的两个参数分别为“当前的activity”,跳转目标activity类的字节码
- 隐式Intent
- 隐式Intent的动作不会出现在java代码当中,而是存在于manifest文件中
- Android系统会使用IntentFilter来匹配响应的组件,匹配的属性主要有:
- action:表示要完成的动作
- data:表示要传输的数据
- category:表示为action添加的额外信息
- 举例,隐式Intent实现activity跳转
-
<activity android:name=".BActivity"> <intent-filter> <action android:name="cn.jp.START_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
在程序中添加
Intent intent = new Intent();
intent.setAction("cn.jp.START_ACTIVITY");
startActivity(intent);
传递数据
两种方法
- 使用Intent的putExtra()方法传递数据
- putExtra()有两个形参,分别为name和value
- 接收这些参数可以使用Intent的getXxxExtra(String name)
- 使用Bundle类传递数据
- 可以理解为打包进行传递
- Bundle类和Map比较类似,是用键值对的形式存储数据
- 使用:
- Bundle bundle = new Bundle();
- bundle.putString("key","value");
- intent.putExtras(bundle);
- 获取:
- Bundle bundle = getIntent().getExtras();
- bundle.getString("key");
数据回传
包含了三个方法
- startActivityForResult(Intent intent,int requestCode)
- 用于开启一个Activity,并希望在销毁的时候,能够从中返回数据
- 第一个参数intent表示意图,不用介绍
- 第二个参数表示请求码,用于表示请求来源。举个例子,如果一个界面的两个button都可以跳转到同一个activity那么使用请求码,就可以知道是从哪个按钮跳转过去的
- setResult(int resultCode,Intent intent)
- 用于携带数据进行回传
- 第一个参数表示返回码,用于标识返回的数据来自哪个activity
- 第二个参数表示用于携带数据
- 值得注意的是setResult只能用来回传数据,并不能跳转到上一个页面,所以我们需要调用finish()方法来关闭当前activity
- onActivityResult(int requestCode, int resultCode, Intent data)
- 用于接收回传数据,并根据requestCode和resultCode来识别数据的来源