信息: 我的设备是带有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
答案 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 docs,android:configChanges
部分说明。
答案 2 :(得分:0)
就是这样。如果您阅读活动生命周期,您将看到这些步骤非常有序。它不仅可以在您的屏幕打开和关闭时,而且还可以在您手机的时候进行操作。 Android会按照您上面提到的步骤重新创建活动。尝试旋转你的屏幕,你会看到! =)
答案 3 :(得分:-2)
有关生命周期的详细说明,请参阅Activity Lifecycle文档,并附图。
最有可能的是,您的活动在屏幕关闭时被杀死以节省资源(电池电量)。正如文档所述,你可以在Android想要释放资源的任何时候被杀死。因此,您应始终将您的活动设计为能够随时停止和重新启动。