01、 定义
Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用可以包含零个或多个Activity。Android系统是通过Activity栈的形式来管理Activity。
02 、Activity的形态
1.Active
Activity处于栈顶,可见,可与用户交互;
2.Pause
可见不可交互;Activity失去焦点或者被一个新的非全屏的Activity挡住(注意:Dialog之类的不会影响到当前Activity);
3.Stopped
不可见;如,完全被其他不透明的Activity覆盖掉。
4.Killed
系统回收掉;
03 、Activity正常情况下的生命周期
生命周期:onCreate()
-> onStart()
- > onResume()
-> onPause()
-> onStop()
-> onDestroy()
-
启动
activity
:系统先调用onCreate()
,然后调用onStart()
,最后调用onResume()
方法,activity
进入运行状态。 -
activity
被其他activity覆盖其上(DialogActivity)或者锁屏:系统会调用onPause()
方法,暂停当前activity
的执行。 -
当前
activity
由被覆盖
状态回到前台或者解锁屏
:系统会调用onResume()
方法,再次进入运行状态。 -
当前
Activity
转到新的Activity
界面或按Home
键回到主屏,自身退居后台:系统会先调用onPause
方法,然后调用onStop
方法,进入停滞状态。 -
用户后退回到此
Activity
:系统会先调用onRestart
方法,然后调用onStart
方法,最后调用onResume
方法,再次进入运行状态。 -
当前
Activity
处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity
,而后用户退回当前Activity
:再次调用onCreate
方法、onStart
方法、onResume
方法,进入运行状态。 -
用户退出当前
Activity
:系统先调用onPause
方法,然后调用onStop
方法,最后调用onDestory
方法,结束当前Activity
。 -
onRestart()
:表示activity
正在重新启动 ,一般情况下,当前activity
从不可见
重新变成可见
状态时,onRestart()
就会被调用,这种情形一般是用户行为所导致的,比如用户按HOME
键切换到桌面然后重新打开APP
或者按back
键。 -
onStart()
:activity
可见了,但是还没有出现在前台,还无法和用户交互。 -
onPause()
:表示activity
正在停止,此时可以做一些存储数据,停止动画等工作,注意不能太耗时,因为这会影响到新activity
的显示,onPause
必须先执行完,新的activity
的onResume
才会执行。 -
从
activity
是否可见来说,onstart()
和onStop()
是配对的,从activity
是否在前台来说,onResume()
和onPause()
是配对的。 -
旧
activity
先onPause
,然后新activity
在启动
注意:当activity
中弹出dialog
对话框的时候,activity不会回调onPause
。
然而当activity
启动dialog风格的activity
的时候,此activity会回调onPause函数
。
04、Activity异常情况下的生命周期
比如当系统资源配置发生改变以及系统内存不足时,activity
就可能被杀死。
情况1:资源相关的系统配置发生改变导致activity
被杀死并重新创建;
比如说当前activity
处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,activity
就会被销毁并且重新创建,当然我们也可以组织系统重新创建我们的activity
。
系统配置发生改变以后,activity
会销毁,其onPause
,onStop
,onDestory
均会被调用,由于activity
是在异常情况下终止的,系统会调用onSaveInstance来保存当前activity
状态,这个方法的调用时机是在onStop之前。与onPause
没有既定的时序关系,当activity
重新创建后,系统会调用onRestoreInstanceState
,并且把activity
销毁时onSaveInstanceState
方法保存的Bundle
对象作为参数同时传递给onRestoreInstanceState和onCreate方法。onRestoreInstanceState()onStart()方法后回调。
同时,在onSaveInstanceState
和onRestoreInstanceState
方法中,系统自动为我们做了一些恢复工作,如:文本框(EditeText
)中用户输入的数据,ListView
滚动的位置等,这些view相关的状态系统都能够默认为我们恢复。可以查看view
源码,和activity
一样,每个view都有onSaveInstanceState方法和onRestoreInstanceState方法
。
防止重新创建activity:activity
指定configChange
属性来不让系统重新创建activity
。android : configChanges = "orientation"
情况2:资源内存不足导致低优先级的activity
被杀死
这里的情况和前面的情况1数据存储和恢复是完全一致的,activity
按照优先级从高到低可以分为如下三种:
(1)前台activity
---正在和用户交互的activity
,优先级最高
(2)可见但非前台activity
---比如activity
中弹出了一个对话框,导致activity
可见但是位于后台无法和用户直接交互。
(3)后台activity
---已经被暂停的activity
,比如执行了onStop
,优先级最低。
05、Activity异常情况下的生命周期
1.Intent/Bundle
可以使用 startActivity()或者startActivityForResult();
1、向目标Activity传递数据:
Intent intent=new Intent(OneActivity.this,SecondActivity.class);
//可传递多种类型的数据
intent.putExtra("name","芒果");
intent.putExtra("age",12);
startActivity(intent);
//创建意图对象
Intent intent = new Intent(OneActivity.this,SecondActivity.class);
//用数据捆传递数据
Bundle bundle = new Bundle();
bundle.putString("data", “传递的数据”);
//把数据捆设置改意图
intent.putExtra("bun", bundle);
//激活意图
startActivity(intent);
2、在目标Activity中取出数据
Intent intent=getIntent();
//用getXxxExtra()取出对应类型的数据。取出String只需要指定key
String name=intent.getStringExtra("name");
//取出int要指定key,还要设置默认值,当intent中没有该key对应的value时,返回设置的默认值
int age=intent.getIntExtra("age",0);
//获取Bundle
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bun");
String str = bundle.getString("data");
2.类静态变量
//声明为静态file
static int age=0;
3.全局变量
重新声明一个类,再类中声明一个全局变量;