繁体   English   中英

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

[英]Activity return to Portrait when Screen is Locked

相关问题:


这是我在我的活动中遇到的奇怪行为。

肖像模式(这是正常的)

  1. 按屏幕锁定, Activity: onPause() ;
  2. 解锁屏幕, Activity: onResume()

风景模式(很奇怪)

  1. 按屏幕锁定, Activity: onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()加载Portrait布局;
  2. 解锁屏幕, Activity: onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()并加载Landscape布局。

我的期望是:

人像模式:(相同)

风景模式:(应该像肖像模式一样)

  1. 按屏幕锁定, Activity: onPause() ;
  2. 解锁屏幕, Activity: onResume()

所以我的问题:

  • 为什么我的活动表现得像这样?
  • 您的活动如何表现?

我的问题的原始文字说明:

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

正如我记得的那样(虽然不是100%肯定),而且我期望的是,我的Activity应该只进行onSaveInstanceState()onPause() ,而在横向模式下使用Lock Screen,就像在Portrait模式下一样。 而不是重新创建活动到肖像并再次回到景观。

是不是我用手机搞砸了什么? 我怎样才能恢复正常?

谢谢!


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

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

这是正常现象。

似乎在手机上,在横向模式下运行的活动在屏幕锁定是正常行为时切换到纵向模式。 至少到目前为止在测试手机上都是如此。 因此,我们必须确保我们的生命周期功能始终能够优雅地关注这一变化。

2.猜测这是因为锁定屏幕中的“默认方向”。

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

进一步研究:

我只是想知道如果我们有一个横向锁定屏幕,活动会如何表现?

您可以停止活动重定向更改,但这通常是一个非常糟糕的主意。

Android文档有一个关于使用此注释处理运行时更改的部分:

注意:自行处理配置更改会使使用备用资源变得更加困难,因为系统不会自动为您应用它们。 当您必须避免因配置更改而重新启动时,此技术应被视为最后的手段,并且不建议用于大多数应用程序。

如果您不需要备用资源, 并且更重要的是,具有性能要求,Android通常仅建议您在轮换时进行重新创建。 在大多数情况下,精心设计的应用程序不需要这样做。

如果你坚持沿着压制默认Android行为的道路,我会修改Raghunandan的代码并包含一个屏幕尺寸属性。 从API级别13开始,屏幕尺寸在方向改变时改变。 因此,除非您仅定位API 12及更低版本,否则必须包含screenSize。

<activity android:name=".MyActivity"
      android:configChanges="orientation|screenSize"
      android:label="@string/app_name">

避免重新启动活动

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

http://developer.android.com/guide/topics/resources/runtime-changes.html

在正常情况下,当您的屏幕被锁定时,您的活动会暂停,当屏幕解锁时,活动会恢复。

屏幕锁定时的问题是: 如果发现内存不足,系统可能会强制停止当前活动,而不是将活动移动到后台 在这种情况下,我们应该保存(所有必要的数据)Activity的当前状态。

将数据保存在onSaveInstanceState()中并恢复数据onRestoreInstanceState()。

@Override
 public void  onSaveInstanceState(Bundle outState)
 {
  Log.v("$````$", "In Method: onSaveInstanceState()");
  //if necessary,set a flag to check whether we have to restore or not
  //handle necessary savings…
 }

@Override
public void onRestoreInstanceState(Bundle inState)
{
  Log.v("$````$", "In Method: onRestoreInstanceState()");
  //if any saved state, restore from it…
}

在你的onCreate()

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);

mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter); //register


public class ScreenReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent)
   {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
        {    
              Log.v("$$$$$$", "In Method:  ACTION_SCREEN_OFF");
              // onPause() will be called.
        }
        else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
        {
              Log.v("$$$$$$", "In Method:  ACTION_SCREEN_ON");
              //onResume() will be called.
              //Better check for whether the screen was already locked
              // if locked, do not take any resuming action in onResume()
              //Suggest you, not to take any resuming action here.       
        }
        else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT))
        {
              Log.v("$$$$$$", "In Method:  ACTION_USER_PRESENT"); 
              //Handle resuming events
        }
  }

在你的onDestroy中

  @Override
  public void onDestroy()
  {
        super.onDestroy();
        Log.v("$$$$$$", "In Method: onDestroy()");

        if (mReceiver != null)
        {
              unregisterReceiver(mReceiver); //unregister 
              mReceiver = null;
        }          

  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM