【问题标题】:Problems understanding the life cycle when screen goes off and on屏幕关闭和打开时理解生命周期的问题
【发布时间】:2011-03-25 08:18:07
【问题描述】:

信息: 我的设备是带有 2.2 的 Nexus One,我测试了两个项目,一个在 1.5 上,一个在 2.1 上。

问题: 当屏幕关闭和打开时,我无法理解我的应用程序的生命周期。

这是我的输出

// activity starts
08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ...
08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ...
// screen goes off
08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ...
08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ...
08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ...
08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ...
08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ...
08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ...
// screen goes on
08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ...
// lock removed
08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ...
08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ...
08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ...
08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ...
08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ...

我完全糊涂了。为什么在屏幕熄灭时重新启动活动?当屏幕已经打开并且只有锁定被移除时,为什么要停止并重新启动它?

为了确保我没有做错任何事,我创建了一个仅包含此活动的新项目。输出相同...

public class LifeCycleTest extends Activity {

    private final static String DEBUG_TAG = "FirstLifeLog";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(DEBUG_TAG, "onCreate executes ...");
        setContentView(R.layout.main);
    }

    protected void onRestart() {
        super.onRestart();
        Log.e(DEBUG_TAG, "onRestart executes ...");
    }

    protected void onStart() {
        super.onStart();
        Log.e(DEBUG_TAG, "onStart executes ...");
    }

    protected void onResume() {
        super.onResume();
        Log.e(DEBUG_TAG, "onResume executes ...");
    }

    protected void onPause() {
        super.onPause();
        Log.e(DEBUG_TAG, "onPause executes ...");
    }

    protected void onStop() {
        super.onStop();
        Log.e(DEBUG_TAG, "onStop executes ...");
    }

    protected void onDestroy() {
        super.onDestroy();
        Log.e(DEBUG_TAG, "onDestroy executes ...");
    }
}

有人有想法吗?

从今天开始更新(不明白为什么它的行为不像上次,也许更多的免费资源?)

// activity starts
08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ...
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ...
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ...
// screen off
08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ...
// screen on
08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ...
// no log for removed screen lock

【问题讨论】:

  • 奇怪的是我看到 onDestroy()、onStart()、onResume() 调用,但我没有看到任何 onCreate() 调用。我也有兴趣了解这种行为。
  • 那是因为我的 onCreate 错过了日志语句......我今天又试了......现在我的游戏有相同的行为,但 testproject 有预期的行为(请参阅更新)跨度>

标签: android android-activity screen lifecycle


【解决方案1】:

Ruben's answer 完全正确,但前提是您的应用程序以 API 级别 12 或更低级别为目标

但由于 API 级别 13 除了 orientation 选项,您还必须声明 screenSize 选项,因为它也会在设备在纵向和横向之间切换时触发:

<activity ... android:configChanges="orientation|screenSize" ... >

否则,当 API 13 或更高平台上的屏幕关闭时,您的 Activity 仍会重新创建一次。

有关参考,请参阅API docsandroid:configChanges 部分注释。

【讨论】:

    【解决方案2】:

    我自己的游戏也有同样的问题。我的游戏只能在横向模式下运行,并且在关闭屏幕时,android 屏幕保护程序会获得控制权(在纵向模式下),因此会发送一个销毁并重新创建活动的orientationChange。

    一个简单的解决方案是声明您将管理自己的屏幕方向更改:

    <activity ... android:configChanges="orientation" ... >
    

    如果您的活动被声明为仅横向(您无需执行任何操作),这很容易,但如果您的活动可以旋转,则可能会变得更难......

    【讨论】:

    • 谢谢!我可能会花一些时间来找出答案。可以确认横向应用程序发生了什么:重新创建一次以更改为纵向,从屏幕关闭后重新创建第二次。 configChanges 的东西也有效。这确实应该正确(突出)记录。
    • 这可能应该被设计为公认的答案,因为尽管它在一个月后出现,但它确定了另一个神秘的原因。
    • 有谁知道如何检测这样的生命周期?我的意思是检测到 onStop 只是因为屏幕关闭而被调用,并且 onStart 很快就会被执行。
    【解决方案3】:

    就是这样。如果您阅读活动生命周期,您会发现这些步骤几乎是按这种方式排列的。它不仅在您的屏幕打开和关闭时,而且在您更改手机的定位时也如此。 Android 完全按照您上面提到的步骤重新创建了活动。试着旋转你的屏幕,你会看到! =)

    【讨论】:

    • 我认为你的前卫与我上面提到的情况非常相似。它必须有一些改变视图的东西,所以活动被杀死并重新创建以在没有屏幕的情况下运行!这只是我的猜测......
    【解决方案4】:

    请参阅 Activity Lifecycle 文档以了解对生命周期的详细描述,并附有图表。

    您的活动很可能因屏幕关闭而被终止以节省资源(电池电量)。正如文档所述,您基本上可以在 Android 想要释放资源的任何时候被杀死。因此,您应该始终将您的活动设计为能够随时停止和重新启动。

    【讨论】:

    • 我知道生命周期文档。节省资源的kill不能是原因,因为它立即重新启动。这正是我的问题。我不明白为什么它被杀死并立即重新启动。当 onDestroy() 被触发时,我在数据库中存储了很多...不必要的应用程序销毁导致响应时间长...
    • 我明白了...我还没有实际测试过这个理论,但是文档讨论了一些 configChanges: developer.android.com/reference/android/… 导致应用程序重新启动。在uiMode下打开和关闭屏幕可能吗?无论如何,您可能想看看是否可以使 onDestroy 更高效。也许在整个过程中保存状态,所以那时要保存的东西更少?
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多