Android 屏幕锁定时活动返回到纵向

Android 屏幕锁定时活动返回到纵向,android,android-activity,android-lifecycle,android-orientation,lockscreen,Android,Android Activity,Android Lifecycle,Android Orientation,Lockscreen,相关问题: 这是我在活动中的一种奇怪行为 肖像模式(正常) 按下屏幕锁,活动:onPause() 解锁屏幕,活动:onResume() 横向模式(很奇怪) 按屏幕锁定,Activity:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()加载纵向布局 解锁屏幕,Activity:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume

相关问题:


这是我在活动中的一种奇怪行为

肖像模式(正常)

  • 按下屏幕锁,
    活动:onPause()
  • 解锁屏幕,
    活动:onResume()
  • 横向模式(很奇怪)

  • 按屏幕锁定,
    Activity:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()
    加载纵向布局
  • 解锁屏幕,
    Activity:onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()
    并加载横向布局
  • 我所期望的是:

    肖像模式:(相同)

    横向模式:(应与纵向模式类似)

  • 按下屏幕锁,
    活动:onPause()
  • 解锁屏幕,
    活动:onResume()
  • 所以我的问题是:

    • 为什么我的活动是这样的
    • 你的活动表现如何

    我的问题的原文说明:

    当我按下手机的锁屏按钮时,当我的活动处于横向模式时,我注意到(在我输出到Eclipse的调试消息中),活动被重新创建为纵向模式(当然,屏幕是全黑的)。然后,当我再次按下锁定屏幕按钮解锁屏幕时,活动被销毁,并重新创建为其肖像

    正如我所记得的(虽然不是100%确定),我所期望的是,我的活动应该只经历
    onSaveInstanceState()
    onPause()
    ,同时在横向模式下锁定屏幕,就像在纵向模式下一样。而不是重新创建活动来描绘和再次回到风景

    是我把手机弄糟了吗?我怎样才能使它恢复正常

    谢谢


    感谢大家对这个问题的贡献。特别感谢@HoanNguyen为我测试他的设备所做的努力。特别感谢@Raghunandan就这个问题与我进行了深入的讨论

    总结到目前为止每个人的贡献,我得出以下结论:

    1.这是正常现象。 似乎在手机上,在屏幕锁定时,处于横向模式的跑步活动切换到纵向模式是一种正常行为。至少到目前为止,在经过测试的手机上是这样。因此,我们必须确保我们的生命周期功能能够始终优雅地处理这一变化

    2.我猜这是因为锁定屏幕中的“默认方向”。 我们没有关于这个问题的文档或很多资源。但是,假设运行活动在屏幕锁定时切换回设备的“默认方向”,就像在大多数设备中锁定的屏幕是纵向的一样,这是非常合乎逻辑的

    进一步研究:
    我只是想知道如果我们有一个横向锁定的屏幕,活动会如何进行?

    以避免活动重新启动

    <activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"//add tthis in manifest
          android:label="@string/app_name">
    
    在onCreate()中

    在你的房间里

      @Override
      public void onDestroy()
      {
            super.onDestroy();
            Log.v("$$$$$$", "In Method: onDestroy()");
    
            if (mReceiver != null)
            {
                  unregisterReceiver(mReceiver); //unregister 
                  mReceiver = null;
            }          
    
      }
    

    您可以在方向更改时停止重新启动活动,但这通常是一个非常糟糕的主意

    Android文档已经发布

    注意:自行处理配置更改会使使用替代资源变得更加困难,因为系统不会自动为您应用这些资源。当您必须避免由于配置更改而重新启动时,应将此技术视为最后手段,并且不推荐用于大多数应用程序

    如果你不需要其他资源,更重要的是,有性能要求的话,Android通常只建议你轮流重新创建。在大多数情况下,设计良好的应用程序不需要这样做

    如果你坚持要压制默认的Android行为,我会修改Raghunandan的代码,并加入屏幕大小属性。从API级别13开始,屏幕大小随方向变化而变化。所以你必须包括屏幕大小,除非你只针对API 12及以下

    <activity android:name=".MyActivity"
          android:configChanges="orientation|screenSize"
          android:label="@string/app_name">
    
    
    
    谢谢您的回复。所以你认为这是由内存不足引起的?我想不是。我有足够的内存,我只是用一行
    System.out.println(getResources().getConfiguration().orientation+“:onCreate”)测试一个非常简单的活动
    onCreate()
    中。我不确定是否使用了
    IntentFilter
    BroadcastReceiver
    。你能解释一下它们的用途吗?谢谢。我不认为这是一个需要考虑的案例。我们将收到屏幕锁定和解锁的广播意向(系统范围广播)。只需通过重写onDestory()onPause()和onResume()将内容记录到logcat即可。您可以处理屏幕锁定和解锁。您不需要重新启动活动??嗯。。。再次感谢。我知道,而且我预计当屏幕被锁定时,活动会暂停并在解锁后恢复。但我注意到,当我处于横向模式时,活动完全重新创建!!这正常吗?还有一个后续问题:这是否意味着对于您提供的代码,在屏幕锁定和解锁时不会调用原始的onPause()和onResume(),而是在那些if-else函数中实现代码?感谢您提供了
    android:configChanges
    方法。但我只是认为当我们锁定屏幕时,活动不应该重新启动。谢谢你的回复。对不起,我一开始说得不够清楚。感谢您提供的
    android:configChanges
    方法。当屏幕锁定时,似乎所有应用程序都将假定为默认方向,感谢@HoanNguyen的回复。你在你的设备上测试过吗?如果你能引用一些关于这个假设的参考资料,那就太完美了!谢谢!我测试了3部手机,一部带有JB,另一部带有IC。我没有这方面的任何参考资料。但是如果你想一想,当设备是平板安卓的时候
      @Override
      public void onDestroy()
      {
            super.onDestroy();
            Log.v("$$$$$$", "In Method: onDestroy()");
    
            if (mReceiver != null)
            {
                  unregisterReceiver(mReceiver); //unregister 
                  mReceiver = null;
            }          
    
      }
    
    <activity android:name=".MyActivity"
          android:configChanges="orientation|screenSize"
          android:label="@string/app_name">