Android的生命周期伴随开发的前后,不掌握好生命周期很容易交互出现bug,所以弄懂生命周期至关重要
为了好的用户体验,让我们来好好了解一下activity的生命周期吧。
Android中的活动是可层叠的。每启动一个新的活动,就会覆盖在原活动上;
然后点击back键会销毁最上面的活动,下面的一个活动就会重新显示出来。
Android用Task管理活动。一个任务就是一组存放在栈里的活动的集合,这个栈被称为返回栈(Back Stack)。
我们都知道栈先进后出,当我们启动一个活动,他会在返回栈中入栈,处于栈顶位置;
当我们按下Back键或者调用 finish()销毁一个活动时,处于栈顶的活动会出栈;
这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会给用户显示处于栈顶的活动。
引用自 https://blog.csdn.net/qingxuan521721/article/details/78737080
活动状态时该Activity在活动栈的栈顶。 一般当Activity创建后就是处于该状态中。
※ 运行触发的函数顺序为: onCreate() ->onStart() -> onResume()。
onCreate()只有在该Activity是第一次被创建时才会被调用,主要是负责Activity的一般性的初始化设置,包括视图的创建,数据的绑定等等。需要注意的是若之前有冻结的state(即系统对该Activity调用过onSaveInstanceState()函数),则可以通过其 Bundle 参数进行state恢复。
onStart()是当Activity正在变为可见状态时才会被调用。一般地在此期间可以注册一个广播等等。
onResume()是在该Activity将要和用户进行交互时被调用,此时Activity位于的活动栈顶。
暂停状态一般指该Activity已失去了焦点但仍可见。比如弹出对话框一类其下层的activity依旧可见。
一个处于暂停状态的Activity只有在系统极度缺乏内存资源的情况下才会被系统强制结束。
※ 运行状态到暂停状态所触发的函数顺序为:onResume() -> onPuased()。
※ 暂停状态恢复至运行状态所触发的函数顺序为:onPuased() -> onResume()。
onPuased()当一个Activity失去系统焦点后将会被调用,包括部分遮挡,以及设备转入休眠状态等等。
停止状态一般指该Activity被另一个Activity完全覆盖的状态,该Activity不可见
所以系统经常会由于内存不足而将该Activity强行结束。
※ 暂停状态到停止状态所触发的函数及顺序为:onPuased() -> onStop()。
※ 停止状态恢复至运行状态所触发的函数及顺序为:onStop() -> onRestart() -> onStart() -> onResume()。
onStop()当一个Activity变为不可见时将会被调用,此时可能是由于该Activity要被注销或新的Activity完全遮挡了该Activity。在此期间一般可以进行取消注册广播等操作,因为用户不可见。
onRestart()是当一个Activity从停止状态恢复至运行状态时将会被优先调用。
销毁状态是指该Activity被系统销毁。
当一个Activity处于暂停状态或停止状态时就随处可能进入此状态,因为系统可能因内存不足而强行结束该Activity。
※ 停止状态到销毁状态分为两种情况:
(1)由用户操作导致,则执行:onStop() -> onDestroy()。
(2)由系统自动强制执行,则该Activity被强行结束。
onDestroy()是当一个Activity正在被系统finished期间被调用的。
onCreate方法:一般做一些初始化工作,比如setContentView去加载布局资源,初始化Activity所需的数据。
onStart方法:表示Activity正在启动,已经可见,但是无法和用户交互。
onResume方法:activity对象完全显示并且开始活动,已经出现在前台,可以交互。
onPause方法:一个activity跳转到另一个activity调用。
onStop方法:一个activity对象被另一个activity对象完全覆盖调用。
onRestart方法:当一个Activity再次启动时调用。
onDestroy方法:一个activity对象被完全销毁时调用。
一个Activity的方法调用情况
很简洁直白的用Android的程序hello world来看一个activity的调用状态过程
这里是这个是众所周知的activity的效果,我们的操作是点开app出现写有hello world页面然后点击back返回
因为我在activity中重写了七个方法并打印在控制台输出,所以我们可以直观的通过操作后控制台日志的打印了解调用函数情况
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("activity生命周期----","onCreate()方法调用");
}
@Override
protected void onStart() {
super.onStart();
Log.i("activity生命周期----","onStart()方法调用");
}
@Override
protected void onResume() {
super.onResume();
Log.i("activity生命周期----","onResume()方法调用");
}
@Override
protected void onPause() {
super.onPause();
Log.i("activity生命周期----","onPause()方法调用");
}
@Override
protected void onStop() {
super.onStop();
Log.i("activity生命周期----","onStop()方法调用");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("activity生命周期----","onDestroy()方法调用");
}
}
结果如下:
两个Activity之间跳转的方法调用情况
这里用控制台输出看一下两个activity之间跳转返回的七个状态函数的调用
activity1将hello world设置点击跳转到activity2的监听,activity2代码同上述一个情况时的activity一样
activity1代码如下:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Button mturn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mturn = (Button)findViewById(R.id.turn);
Log.i("activity1生命周期----","onCreate()方法调用");
mturn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.i("activity1生命周期----","onStart()方法调用");
}
@Override
protected void onResume() {
super.onResume();
Log.i("activity1生命周期----","onResume()方法调用");
}
@Override
protected void onPause() {
super.onPause();
Log.i("activity1生命周期----","onPause()方法调用");
}
@Override
protected void onStop() {
super.onStop();
Log.i("activity1生命周期----","onStop()方法调用");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("activity1生命周期----","onDestroy()方法调用");
}
}
两个activity间的操作结果
①启动app,activity1页面出现,点击按钮activity1跳转到activity2
②由①之后继续点击back键返回到了activity1
③在activity1页面点击back键
可以得出
1)启动Activity:
系统会先调用onCreate方法,这是生命周期第一个方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2)当前Activity被其他Activity覆盖其上或被锁屏:
系统会调用onPause方法,暂停当前Activity的执行。
3)当前Activity由被覆盖状态回到前台或解锁屏:
系统会调用onResume方法,再次进入运行状态。
4)当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:
系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5)用户后退回到此Activity:
系统会先调用onRestart方法,然后调用onStart方法,
最后调用onResume方法,再次进入运行状态。
6)用户退出当前Activity;
系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。