我在Nexus 5上有一个奇怪的行为,当我进进出出进入睡眠模式。它以一种非常奇怪的方式杀死并重新启动应用程序。我给你看日志:
进入睡眠模式(按电源按钮)
17.005: e/母活性(28940):onPause调用
17.025: e/母活性(28940):onStop调用
17.315: e/母活性(28940):onDestroy调用
17.365: E/GameTuto1 MainActivity (28940):调用MainActivity构造函数
17.365: e/母活性(28940):onCreate调用
17.695: e/母活性(28940):onStart调用
17.705: e/母活性(28940):onResume调用
17.705: e/母活性(28940):onPause调用
从睡眠模式回来,打开手机时
755: e/母活性(28940):onResume调用
935: e/母活性(28940):onPause调用
935: e/母活性(28940):onStop调用
然后电话就被冻结了直到我终止了这个过程。但是,为什么我在继续我的应用程序(从睡眠模式回来)的时候要通过onPause和onStop,以及为什么onCreate,OnStart,onResume,onPause在进入睡眠模式时?
如果我对Nexus7做同样的事情,它不会发生,生命周期是“正常的”。下面的日志:
进入睡眠模式(按电源按钮)
43.782: e/母活性(19876):onPause称为43.822: e/母活性(19876):onStop称为
从睡眠模式回来,打开手机时
50.142: e/母活性(19876):onRestart称为50.142: e/母活性(19876):onStart称为50.172: e/母活性(19876):onResume调用
这个问题是奇怪的,也可能是错误的(也许),但答案可能是非常聪明的。如果你有主意的话?这种情况只发生在我有3个线程的项目上:2个循环线程(我在onPause中杀死)和一个由PoolExecutor管理的线程(也在onPause中终止)。如果我做了一个简单的应用程序,它就不会被复制。Nexus5 version=4.4.2,nexus7 version=4.2.2
我知道,在这个问题上没有密码,我不能分享我的项目。
但首先要感谢所有会思考这个问题的人。
玛蒂亚斯..。5小时后:答案.在我的活动清单中,我有:
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main"
**android:screenOrientation="landscape"**
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> 如果我去掉android:screenOrientation=的“景观”,它就能正常工作了。知道为什么会这样吗?为什么我不能把我的方向设置为景观,并忘记了configurationChange事件。
最糟糕的是,如果我听到方向配置发生了变化:
android:configChanges="orientation"方法onConfigurationChanged不被调用!但是如果我用: android:configChanges="orientation|screenSize“和改写onConfiguration,它就能工作.
为什么screenOrientation=landscape不能处理screenSize配置的变化呢?有没有另一种干净的方法来处理这种混乱,然后对系统说:“当我把手机放到睡眠模式时,别把我搞砸了。”
如果有人知道的话,谢谢你的回答。
否则,这意味着如果您希望您的应用程序是纵向的或景观,您需要让android:configChanges="orientation|screenSize“到您的清单和覆盖onConfigurationChanged在您的活动(为了什么都不做)。oO的
发布于 2014-04-02 07:01:26
所以窃听器是因为方向的改变..。但不是真的。事实上,当Nexus 5进入睡眠模式和您的活动处于肖像状态时,作为configurationChange事件触发的不是“方向”更改(在我的例子中)而是“configurationChange更改”。它不会发生在Nexus 7上,因为它的正常模式是睡觉时的景致,所以不会触发configurationChange。
溶液
这意味着,在HoneyComb之后(因为HC已经开始使用screenSize ),如果在您的清单中,您正在使用
android:screenOrientation="landscape"您还需要在清单中使用以下一行:
android:configChanges="orientation|screenSize"在您的MotherActivity中(由您的活动继承的)或在您的活动中,您必须以这种方式覆盖配置更改方法:
/*
* (non-Javadoc)
* @see android.app.Activity#onConfigurationChanged(android.content.res.Configuration)
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.e("MotherActivity", "onConfigurationChanged called ");
// this method is there to ensure no configuration changes when going to sleep mode
// because the device wants my app to go on portrait and then fire screenSize changes
// sometime some montainview code sucks
super.onConfigurationChanged(newConfig);
// and of course do nothing !!!
}可以在这里查看一下,以便更好地了解onConfigurationChange和如何处理它。@http://developer.android.com/guide/topics/resources/runtime-changes.html
回到我的问题
在我的例子中,由于没有预期的配置更改,我正在与丢失的线程进行斗争。
简单技巧n°1
因此,要避免这种痛苦并快速发现它,一个简单的技巧就是在dev模式下向您的母亲活动添加日志。因此,在测试时,您总是有活动生命周期的日志。它将帮助你避免生命周期混乱。
例:
/*
* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("MotherActivity", "onCreate called");
super.onCreate(savedInstanceState);
}螺纹定律
最后,我的意思是始终深入查看您的线程(如果有),确保没有内存泄漏(线程必须死),并确保在配置更改或确保处理配置更改时保留线程(onRetainNonConfigurationInstance或使用不带GUI和setRetainInstance的片段(True))。
简单技巧n°2
另一个窍门是侦听mcc和mnc (在您的清单android:configChanges="orientation|screenSize|mcc|mcn"),中),因为您的应用程序大部分时间都不关心更改电信运营商。大多数时候你都没有测试过那个案子。
祝大家今天愉快!
https://stackoverflow.com/questions/22780028
复制相似问题