Activity的常用方法
Activity启动模式
方法执行顺序 | 调用 | 说明 |
---|---|---|
standard | 标准模式(默认) | |
singleTop | 栈顶复用模式 | |
singleTask | 栈内复用模式 | |
singleInstance | 单实例模式 - 加强的singleTask模式 |
standard : 在启动了这个Activity栈的栈顶重新创建一个新的实例
singleTop:
- 判断需要启动的Activity是否为任务栈栈顶 ,如果是,则不会重新创建,如果不是,则会重新创建
- 不重新创建时候,该Activity的 onNewIntent(Intent intent) 方法会被回调,通过该方法的参数,可以取出当前请求的信息;
- 系统可能会杀死该Activity,杀死之后,启动情况与第一次启动相同,所以有必要在onCreate与onNewIntent方法中调用同一个处理数据的方法
- 运用场景:常运用于通知栏弹出Notification,点击Notification跳转到指定的Activity,设置singleTop模式
生命周期相关方法
方法执行顺序 | 调用 | 主用途 | 是否可见(Visibility) | 用户交互(Click) |
---|---|---|---|---|
onCreate() | 创建 | 初始化 | NO | ON |
onStart() | 开始 | YES | ON | |
onRestart() | 重新开始 | YES | ON | |
onResume() | 获得焦点且可见 | YES | YES | |
onPause() | 失去焦点且可见 | YES | NO | |
onStop() | 不可见 | NO | NO | |
onDistory() | 销毁 | 关闭资源 | NO | NO |
1.1 Activity的生命周期全面解析
本节将Activity的生命周期分为两部分内容,第一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。
典型情况:指在有用户参与的情况下,Activity所经过的生命周期的改变;
异常情况:指Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。
1.1.1 典型情况下的生命周期分析
onCreate>onRestart>onStart>onResum>onPause>onStop>onDistroy
正常情况下,Activity的常用生命周期就只有上面7个,具体情况如下表所示:
编号 | header3 | |
---|---|---|
1 | 第一次启动 | onCreate>onStart>onResume |
2 | 打开新的Activity | onPause>onStop 如果新打开的Activity为透明主题,当前Avctivity不会回调Stop,只回调onPause方法。 |
3 | 切换到桌面 | onPause>onStop |
4 | 再次回到Activity | onRestart>onStart>onResume |
5 | 用户按back键回退时 | onPause>onStop>onDestroy |
6 | Activity被系统回收再次打开 | 生命周期方法与回调过程同1一样,注意只是生命周期方法一样,不代表所有过程都一样,后面详细解释。 |
Activity有如此多方法的原因,方法配对:
- Activity的创建与销毁,从创建销毁的角度考虑。 onCreate>onDstroy
- Activity是否可见,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能被调用多次。从Activity是否可见的角度考虑 onStart>Stop
- Activity是否在前台,从Activity是否位于前台考虑 onResume>onPause
除了这种区别,在实际使用中没有其他明显区别。
一个Activity启动另一个Activity的方法顺序:
OldActivity.onCreate() > OldActivity.onRetart() >
OldActivity.onStart() > OldActivity.onResum() >
NewActivity.onCreate().OldActivity.onStop()
关闭Activity的方法
方法 | 调用 |
---|---|
activity.onFinish() | 依次调用Activity生命周期相关方法正常关闭 |
android.os.Process.killProcess(android.os.Process.myPid()) | 绕过Activityd的生命周期强制关闭 |
isFinishing() | 在activity被销毁前会调用该方法 |
1. activity在finish时候,还有收到广播,结果导致bug在广播接收器中先判断一下比较保险。或者在onDestroy里面注销广播
2. acivity在finish时候,这时候handler.sendMessage,这时候也会导致bug
这时候最好在finish函数里面removeAllCallbackAndMessage(this)
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.d(TAG, intent.toString());
final String action = intent.getAction();
if(isFinishing())
{
。。。。。。。
return;
}
}
一个Activity打开另一个Activity的方法
方法 | 调用 |
---|---|
startActivity(Intent) | 打开一个Activity |
startActivity(Intent,Bundle) | 打开一个Activity并通过Bundle传递参数 |
startActivities(Intent[]) | 打开多个Activity |
startActivities(Intent[],Bundle) | 打开多个Activity并通过Bundle传递参数 |
startActivityForResult(Intent,int requestCode) | 打开一个Activity并获取返回结果, |
startActivityForResult(Intent,int,Bundle) | 返回结果通过onActivityResult()方法获取。 |
- Intent:组件之间调用需要使用Intent,可以调用setExtra()方法传递数据
- Intent[]:Intent数组,根据在数组中的顺序依次调用
- int requestCode:与onActivityResult(int requestCode, int resultCode,
Intent data)中的requestCode对应
- Bundle 可以通过Bundle传递数据
一个Activity向另一Activity返回结果
步骤 | 方法 | 调用 |
---|---|---|
1 | setResult(int resultCode) | 返回结果码 |
1 | setResult(int resultCode,Intent) | 返回结果码和通过Intent传递数据 |
2 | finish() | 关闭当前Activity |
一个Activity打开另一个Activity,然后获取返回结果
方法 | 调用 |
---|---|
onActivityResult(int requestCode, int resultCode, Intent data) |
通过startActivityForResult()方法启动另外一个Activity才会调用onActivityResult(),startActivity()方法和startActivities()不会调用此方法。
- int requestCode:通过 startActivityForResult(Intent,int requestCode)设置的请求码
- int resultCode:通过setResult(int resultCode)设置的返回码
- Intent
一个Activity获取另一个Activity返回结果
步骤 | 方法 | 调用 |
---|---|---|
1 | activityA.startActivityForResult(Intent,int requestCode) | Activity调用 |
2 | activityB.setResult(int resultCode) | 返回结果码 |
2 | activityB.setResult(int resultCode,Intent) | 返回结果码和通过Intent传递数据 |
3 | activityB.finish() | 关闭当前Activity |
4 | activityA.onActivityResult(int requestCode, int resultCode, Intent) | Intent是setResult()方法返回的Intent |
- int requestCode 请求码
- int resultCode
- Intent 通过intent传递数据
保存、恢复当前Activity状态
步骤 | 方法 | 调用 |
---|---|---|
1 | activityA.onSaveInstanceState(Bundle,PersistableBundle) | 储存需要保存的变量 |
1 | activityA.onSaveInstanceState(Bundle) | 储存需要保存的变量 |
2 | activityA.onRestoreInstanceState(Bundle,PersistableBundle) | 恢复保存的变量 |
2 | activityA.onRestoreInstanceState(Bundle) | 恢复保存的变量 |
- 情况1.资源相关的系统配置发生改变
- 情况2:资源内存不足导致低优先级Activity被杀死