屏幕熄灭时了解生命周期的问题

时间:2010-08-04 15:37:36

标签: android android-activity screen lifecycle

信息: 我的设备是带有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

4 个答案:

答案 0 :(得分:30)

我对自己的游戏也有同样的问题。我的游戏仅适用于风景,当关闭屏幕时,Android屏幕保护程序采用控制(纵向模式),从而发送一个direChange,用于销毁和重新创建活动。

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

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

如果您的活动被宣布为仅景观(您必须不做任何事情),这很容易,但如果您的活动可以轮换,则会变得更难......

答案 1 :(得分:4)

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

但是,除了orientation选项之外的API级别13,您还必须声明screenSize选项,因为当设备在纵向和横向之间切换时,它也会被触发:< / p>

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

否则,当屏幕在API 13或更高版本的平台上关闭时,您的活动仍会被重新创建。

如需参考,请参阅API docsandroid:configChanges部分说明。

答案 2 :(得分:0)

就是这样。如果您阅读活动生命周期,您将看到这些步骤非常有序。它不仅可以在您的屏幕打开和关闭时,而且还可以在您手机的时候进行操作。 Android会按照您上面提到的步骤重新创建活动。尝试旋转你的屏幕,你会看到! =)

答案 3 :(得分:-2)

有关生命周期的详细说明,请参阅Activity Lifecycle文档,并附图。

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