活动返回时纵向屏幕锁定(Activity return to Portrait when Scree

2019-08-18 00:45发布

相关的问题:

  • https://stackoverflow.com/questions/15648713/strange-behaviour-while-screen-lock-in-landscape

这是一个奇怪的现象我在活动了。

人像模式(这是正常的)

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

风景模式(很奇怪)

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

我想到的是:

人像模式:(相同)

风景模式:(应该像人像模式)

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

所以我的问题:

  • 为什么我的活动这样的表现?
  • 请问你的活动的行为?

我的问题的原始文本描述:

当我按我的电话,当我的活动是在其风景模式,我注意到的锁屏键(在调试消息I输出到Eclipse)活动是重新创建其肖像模式(而屏幕是全黑的,当然)。 然后,当我再次按下锁屏键解锁屏幕,活动被破坏并重新创建其肖像一次。

我记得(不是100%肯定,虽然),和我所期望的是,我的活动应该只接受onSaveInstanceState()onPause()而锁定屏幕横向模式,像什么它在纵向模式。 而不是重新创建活动为纵向,并再次回到景观。

难道我搞砸了我的电话的东西吗? 我怎样才能修复它恢复正常?

谢谢!


感谢大家贡献到这个问题。 特别感谢@HoanNguyen他在他的设备上进行测试,我的努力。 特别是感谢@Raghunandan因与我就这一问题进行了深入的讨论。

总结大家的捐款,到目前为止,我有以下的结论:

1.这是一个正常的现象。

看来,在手机上,正在运行的活动,是在风景模式下,在屏幕锁定切换到肖像模式是一种正常的行为。 至少它是在测试手机真正至今。 因此,我们必须确保我们的生命周期功能可以照顾这一变化总是优雅。

2.猜这是因为在锁定屏幕的“缺省方向”。

我们没有文件或多个资源谈到这个问题。 但假设跑步活动切换回设备的“默认方向”在锁屏,因为在大多数设备锁定屏幕处于纵向,是很合乎逻辑的。

进一步研究:

我只是想知道活动的行为,如果我们有一个景观锁定的屏幕?

Answer 1:

您可以重新启动与方向的变化停止活动,但是这通常是一个非常糟糕的主意。

Android的文档中有关于处理与本说明运行变化的部分:

注:处理配置更改自己可以使它更难以利用替代资源,因为系统不会自动为您应用这些。 这种技术应被视为最后的手段,当你必须避免因配置更改重新启动,因此不建议对于大多数应用。

Android的一般只建议你剿重现上旋转,如果你不需要备用资源更重要的是,有一个性能要求。 一个设计良好的应用程序不应该要做这在大多数情况下。

如果你坚持下去的supressing Android默认的行为路径,我会修改Raghunandan的代码,并包括一个屏幕大小的属性也是如此。 由于API等级13,屏幕尺寸在屏幕方向的改变。 所以,你必须包括屏幕尺寸,除非你只针对API 12及以下。

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


Answer 2:

为了避免重新启动活动

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

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

当屏幕锁定的一个问题是: 当前活动可以有力地被系统停止而不是移动的活动背景,如果它发现的内存不足。 在这种情况下,我们应该有保存(所有必要的数据),则活动的当前状态。

保存在你的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;
        }          

  }


文章来源: Activity return to Portrait when Screen is Locked