最近突然发现Activity在锁屏时生命周期有点奇怪,在我的手机魅族7.1.1上测试基本是下面的结果:
按下电源键锁屏:onPause-----onStop
再按下电源键解锁:onRestart-----onStart-----onResume
这个结果还是比较准确的,大多数时候都是这样的结果,但是跟其网上他人所描述的情况有所不同,大部分人会出现在锁屏时Activity进行销毁重建(onDestroy onCreate),在解锁时Activity又进行一次进行销毁重建(onDestroy onCreate),也就是会执行两次生命周期,原因是没有在AndroidManifest.xml中配置android:screenOrientation
和android:configChanges
,可是我测试的Activity并没有配置这些,在按下电源键进行锁屏以及再次按电源键进行解锁时也不会出现销毁重建的现象。
Activity的测试类:
<activity android:name=".TestAActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
public class TestAActivity extends Activity {
private final static String TAG = "AAA";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_1);
Log.e(TAG, "TestAActivity onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "TestAActivity onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "TestAActivity onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "TestAActivity onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "TestAActivity onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "TestAActivity onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "TestAActivity onDestroy");
}
}
很简单,没有特殊配置,但是我的手机上测试是正常的生命周期流程,就是先onPause-----onStop,后onRestart-----onStart-----onResume
--------------------------------update 2019-3-25--------------------------------------------------------
大概找到异常的原因了,有可能是在锁屏和亮屏的过程中有第三方的Activity界面尝试在锁屏下弹出,但是由于它又没有获得在锁屏下弹出的权限,这时第三方的这个Activity会先onCreate后onDestroy,也就是先创建后销毁,有可能会有多次,因此自己的Activity也会走多个生命周期回调循环。
--------------------------------以下是异常情况--------------------------------------------------------
但是,还没完,在前几天的测试过程中发现的结果是下面这样的:
按电源键锁屏之后:
onPause
onStop
onRestart
onStart
onResume
onPause
onStop
onRestart
onStart
onResume
onPause
onStop
也就是除了onPause和onStop外,会执行两次onRestart到onStop之间的生命周期,这个就很神奇了
解锁之后:
onRestart
onStart
onResume
解锁之后的生命周期跟原来一致
按下一次电源键点亮屏幕(注意只是点亮还停留在锁屏壁纸界面),过一会儿然后再按下电源键熄灭屏幕:
onRestart
onStart
onResume
onPause
onStop
onRestart
onStart
onResume
onPause
onStop
这时会执行两次onRestart到onStop之间的生命周期,这个也很奇怪
按下一次电源键点亮屏幕(注意只是点亮还停留在锁屏壁纸界面),马上按下电源键熄灭屏幕再按电源键点亮屏幕(也就是在瞬间按下两次电源键):
onRestart
onStart
onResume
onPause
onStop
以上是确实出现过的情况,原因不明(可能是手机系统的或者有其他的应用在作怪吧),而且当时不管在AndroidManifest.xml中有没有配置android:screenOrientation
和android:configChanges
结果都是一样的,生命周期比较混乱,没有规律可言,但是在后面的测试中就再也无法重现这些情况了,真是见鬼了,后面测试的结果就只有开头提到的那一种了。也可能是跟机型有关,锁屏时的周期还是需要注意一下的。