相关的问题:
- https://stackoverflow.com/questions/15648713/strange-behaviour-while-screen-lock-in-landscape
这是一个奇怪的现象我在活动了。
人像模式(这是正常的)
- 按屏幕锁定,
Activity: onPause()
; - 解锁屏幕,
Activity: onResume()
风景模式(很奇怪)
- 按屏幕锁定,
Activity: onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
它加载纵向布局; - 解锁屏幕,
Activity: onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
并加载景观布局。
我想到的是:
人像模式:(相同)
风景模式:(应该像人像模式)
- 按屏幕锁定,
Activity: onPause()
; - 解锁屏幕,
Activity: onResume()
所以我的问题:
我的问题的原始文本描述:
当我按我的电话,当我的活动是在其风景模式,我注意到的锁屏键(在调试消息I输出到Eclipse)活动是重新创建其肖像模式(而屏幕是全黑的,当然)。 然后,当我再次按下锁屏键解锁屏幕,活动被破坏并重新创建其肖像一次。
我记得(不是100%肯定,虽然),和我所期望的是,我的活动应该只接受onSaveInstanceState()
和onPause()
而锁定屏幕横向模式,像什么它在纵向模式。 而不是重新创建活动为纵向,并再次回到景观。
难道我搞砸了我的电话的东西吗? 我怎样才能修复它恢复正常?
谢谢!
感谢大家贡献到这个问题。 特别感谢@HoanNguyen他在他的设备上进行测试,我的努力。 特别是感谢@Raghunandan因与我就这一问题进行了深入的讨论。
总结大家的捐款,到目前为止,我有以下的结论:
1.这是一个正常的现象。
看来,在手机上,正在运行的活动,是在风景模式下,在屏幕锁定切换到肖像模式是一种正常的行为。 至少它是在测试手机真正至今。 因此,我们必须确保我们的生命周期功能可以照顾这一变化总是优雅。
2.猜这是因为在锁定屏幕的“缺省方向”。
我们没有文件或多个资源谈到这个问题。 但假设跑步活动切换回设备的“默认方向”在锁屏,因为在大多数设备锁定屏幕处于纵向,是很合乎逻辑的。
进一步研究:
我只是想知道活动的行为,如果我们有一个景观锁定的屏幕?
您可以重新启动与方向的变化停止活动,但是这通常是一个非常糟糕的主意。
Android的文档中有关于处理与本说明运行变化的部分:
注:处理配置更改自己可以使它更难以利用替代资源,因为系统不会自动为您应用这些。 这种技术应被视为最后的手段,当你必须避免因配置更改重新启动,因此不建议对于大多数应用。
Android的一般只建议你剿重现上旋转,如果你不需要备用资源,更重要的是,有一个性能要求。 一个设计良好的应用程序不应该要做这在大多数情况下。
如果你坚持下去的supressing Android默认的行为路径,我会修改Raghunandan的代码,并包括一个屏幕大小的属性也是如此。 由于API等级13,屏幕尺寸在屏幕方向的改变。 所以,你必须包括屏幕尺寸,除非你只针对API 12及以下。
<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 。
在当屏幕被锁定正常情况下您的活动将暂停,当屏幕解锁活动恢复。
当屏幕锁定的一个问题是: 当前活动可以有力地被系统停止而不是移动的活动背景,如果它发现的内存不足。 在这种情况下,我们应该有保存(所有必要的数据),则活动的当前状态。
保存在你的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;
}
}