首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nexus 5进入睡眠模式使活动生命周期变得无趣

Nexus 5进入睡眠模式使活动生命周期变得无趣
EN

Stack Overflow用户
提问于 2014-04-01 08:04:02
回答 1查看 1.4K关注 0票数 4

我在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小时后:答案.在我的活动清单中,我有:

代码语言:javascript
复制
<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事件。

最糟糕的是,如果我听到方向配置发生了变化:

代码语言:javascript
复制
android:configChanges="orientation"

方法onConfigurationChanged不被调用!但是如果我用: android:configChanges="orientation|screenSize“和改写onConfiguration,它就能工作.

为什么screenOrientation=landscape不能处理screenSize配置的变化呢?有没有另一种干净的方法来处理这种混乱,然后对系统说:“当我把手机放到睡眠模式时,别把我搞砸了。”

如果有人知道的话,谢谢你的回答。

否则,这意味着如果您希望您的应用程序是纵向的或景观,您需要让android:configChanges="orientation|screenSize“到您的清单和覆盖onConfigurationChanged在您的活动(为了什么都不做)。oO的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-02 07:01:26

所以窃听器是因为方向的改变..。但不是真的。事实上,当Nexus 5进入睡眠模式和您的活动处于肖像状态时,作为configurationChange事件触发的不是“方向”更改(在我的例子中)而是“configurationChange更改”。它不会发生在Nexus 7上,因为它的正常模式是睡觉时的景致,所以不会触发configurationChange。

溶液

这意味着,在HoneyComb之后(因为HC已经开始使用screenSize ),如果在您的清单中,您正在使用

代码语言:javascript
复制
 android:screenOrientation="landscape"

您还需要在清单中使用以下一行:

代码语言:javascript
复制
 android:configChanges="orientation|screenSize"

在您的MotherActivity中(由您的活动继承的)或在您的活动中,您必须以这种方式覆盖配置更改方法:

代码语言:javascript
复制
 /*
 * (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模式下向您的母亲活动添加日志。因此,在测试时,您总是有活动生命周期的日志。它将帮助你避免生命周期混乱。

例:

代码语言:javascript
复制
/*
 * (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"),中),因为您的应用程序大部分时间都不关心更改电信运营商。大多数时候你都没有测试过那个案子。

祝大家今天愉快!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22780028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档