Android Activity 生命周期和锁定/解锁设备

Posted

技术标签:

【中文标题】Android Activity 生命周期和锁定/解锁设备【英文标题】:Android Activity lifecycle and locking/unlocking device 【发布时间】:2013-10-12 20:35:58 【问题描述】:

我刚刚发现当设备启用锁屏时,会发生以下情况。 对于此活动,在清单中设置了 android:screenOrientation="landscape"。 然后我用我的手机在纵向模式下执行以下操作。

    用户打开了一个活动。 onCreated() 被调用 onStart() 被调用 onResume() 被调用 用户锁定设备 4.5 onPause 被调用() onDestroy() 被调用 onCreate() 被调用 onStart() 被调用 onResume() 被调用 8.5 onPause 被调用() 用户解锁设备 onResume() 被调用 onDestroy() 被调用 onCreate() 被调用 onStart() 被调用 onResume() 被调用。

好吧,我不明白为什么屏幕熄灭后执行6,7,8.. 我也不明白为什么要执行 11、12、13、14。 当我锁定和解锁设备时会发生一些奇怪的事情吗?我突然对活动生命周期感到困惑。有人可以澄清一下吗?

附上代码和日志消息

package com.example.wf;

import android.app.Activity;
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.d("log", "oncreate");   
    

    @Override
    protected void onResume() 
        super.onResume();
        Log.d("log", "onresume");
    ;

    @Override
    protected void onStart() 
        super.onStart();
        Log.d("log", "onstart");
    ;

    @Override
    protected void onPause() 
        super.onStart();
        Log.d("log", "onpause");
    ;

    @Override
    protected void onDestroy() 
        Log.d("log", "ondestroy");      
        super.onDestroy();
    ;

记录消息

10-05 23:11:07.994: D/log(23810): oncreate
10-05 23:11:07.994: D/log(23810): onstart
10-05 23:11:07.994: D/log(23810): onresume
// LOCK DEVICE
10-05 23:11:19.957: D/log(23810): ondestroy
10-05 23:11:20.007: D/log(23810): oncreate
10-05 23:11:20.007: D/log(23810): onstart
10-05 23:11:20.007: D/log(23810): onresume
// UNLOCK DEVICE
10-05 23:11:57.407: D/log(23810): onresume
10-05 23:11:57.537: D/log(23810): ondestroy
10-05 23:11:57.587: D/log(23810): oncreate
10-05 23:11:57.587: D/log(23810): onstart
10-05 23:11:57.587: D/log(23810): onresume

【问题讨论】:

自 2 天以来一直在努力解决这个问题,尝试了各种选择 【参考方案1】:

在手机(或方向锁定为纵向的平板电脑)上,锁定屏幕仅为纵向。因此,当设备被锁定时,设备会自动切换到纵向模式(导致 6、7、8 和 9)。当设备解锁时,onResume() 被调用,因为您的 Activity 变得可见,但是您再次在纵向和现在锁定在横向之间转换,因此 Activity 被销毁并在横向中重新创建。

【讨论】:

很好的解释。 完美解释。只有在横向模式下,Activity 才会在锁定/解锁时重新创建。 好的,Activity 被重新创建以满足锁屏要求(仅限纵向),但为什么 Activity 最终以 onResume 状态运行?【参考方案2】:

为了克服活动重新创建场景,您可以使用 android:configChanges="orientation" 属性通过 android manifest 文件在活动级别处理配置更改。

【讨论】:

对我来说,当我删除 android:configChanges="orientation" 时,它可以正常工作

以上是关于Android Activity 生命周期和锁定/解锁设备的主要内容,如果未能解决你的问题,请参考以下文章

Android Activity的生命周期简单总结

Android Activity生命周期解析

android activity的生命周期和启动模式

Android进阶知识——Activity的生命周期和启动模式

Android进阶知识——Activity的生命周期和启动模式

Android - Activity 生命周期