簡體   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