![](/img/trans.png)
[英]Locked landscape orientation on tablet + activity started when device in portrait = visible rotation on screen
[英]Activity return to Portrait when Screen is Locked
相關問題:
這是我在我的活動中遇到的奇怪行為。
肖像模式(這是正常的)
Activity: onPause()
; Activity: onResume()
。 風景模式(很奇怪)
Activity: onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
加載Portrait布局; Activity: onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()
並加載Landscape布局。 我的期望是:
人像模式:(相同)
風景模式:(應該像肖像模式一樣)
Activity: onPause()
; Activity: onResume()
。 所以我的問題:
我的問題的原始文字說明:
當我按下手機的鎖屏按鈕時,當我的Activity處於其橫向模式時,我注意到(在我輸出到Eclipse的調試消息中),Activity被重新創建為其Portrait模式(而屏幕全是黑色,當然)。 然后當我再次按下鎖定屏幕按鈕解鎖屏幕時,活動被銷毀並再次重新創建其肖像。
正如我記得的那樣(雖然不是100%肯定),而且我期望的是,我的Activity應該只進行onSaveInstanceState()
和onPause()
,而在橫向模式下使用Lock Screen,就像在Portrait模式下一樣。 而不是重新創建活動到肖像並再次回到景觀。
是不是我用手機搞砸了什么? 我怎樣才能恢復正常?
謝謝!
感謝大家為這個問題做出貢獻。 特別感謝@HoanNguyen在他的設備中為我測試的努力。 特別感謝@Raghunandan就這個問題與我進行了深入的討論。
總結到目前為止每個人的貢獻,我得出以下結論:
似乎在手機上,在橫向模式下運行的活動在屏幕鎖定是正常行為時切換到縱向模式。 至少到目前為止在測試手機上都是如此。 因此,我們必須確保我們的生命周期功能始終能夠優雅地關注這一變化。
我們沒有關於此問題的文檔或許多資源。 但是假設在屏幕鎖定時運行的活動切換回設備的“默認方向”,就像在大多數設備中鎖定的屏幕是縱向一樣,這是非常合乎邏輯的。
我只是想知道如果我們有一個橫向鎖定屏幕,活動會如何表現?
您可以停止活動重定向更改,但這通常是一個非常糟糕的主意。
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.