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

信息:我的设备是2.2版本的Nexus One,我testing了两个项目,一个是1.5,一个是2.1。

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

这是我的输出

// 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 ... 

我完全困惑。 为什么在屏幕熄灭时重新启动活动? 为什么停止并重新启动,当屏幕已经打开,只有锁被删除?

为了确保我没有做错任何事情,我只用这个活动创build了一个新项目。 输出是相同的…

 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 ..."); } } 

有人有一个想法吗?

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

 // 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 

Solutions Collecting From Web of "了解屏幕熄灭时的生命周期问题"

有关生命周期的详细说明,请参阅活动生命周期文档。

很有可能您的活动会随着屏幕熄灭而节省资源(电池电量)而死亡。 正如文档所述,只要Android想要释放资源,基本上都可以被杀死。 因此,您应该始终devise您的活动,以便随时能够停止并重新启动。

我对自己的游戏也有同样的问题。 我的游戏只适用于风景,当closures屏幕时,android屏幕保护程序将采取控制(以纵向模式),从而发送一个orientationChange来销毁和重新创build活动。

一个简单的解决scheme是声明你将自己pipe理屏幕方向的变化:

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

如果你的活动被声明为只有风景(你不必做任何事情),这很容易,但如果你的活动可以旋转,可以变得更难…

鲁本的答案是完全正确的, 但只有当你的应用程序的目标级别为12或更低

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

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

否则,当API 13或更高平台上的屏幕熄灭时,您的活动仍将被重新创build。

有关参考,请参阅API文档 , android:configChanges节注释。

就是这个方法。 如果你阅读活动生命周期,你会看到这些步骤是非常有序的。 它不只是当你的屏幕上下,而且当你打电话的时候。 Android按照上面提到的步骤重新创build了该活动。 试着旋转你的屏幕,你会看到的! =)