關于Android橫豎屏切換及Activity重啓周期的總結

本文我在網上總結了幾篇關于禁止Android橫豎屏,解決切換螢幕時重啓Activity的方法,解決Android手機 螢幕橫豎屏切換,如何讓Android橫豎屏切換時不銷毀當前activity。

禁止Android橫豎屏和解決切換螢幕時重啓Activity的方法
1.在AndroidManifest.xml的Activity配置中加入 android:screenOrientation=”landscape”屬性(landscape是橫向,portrait是縱向)。如:

<activity android:name=".ContactsManagerActivity" android:label="@string/app_name" android:screenorientation="portrait">
  <intent-filter>
    <action android:name="android.intent.action.MAIN">
    <category android:name="android.intent.category.LAUNCHER">
  </category></action></intent-filter>
</activity>


2.一般橫豎屏切換時,activity要重啓,爲了避免重啓,可以爲activity 添加android:configChanges=“orientation”屬性,然後在activity中複寫onConfigurationChanged()方法,例如:

public void onConfigurationChanged(Configuration newConfig) {
  // TODO Auto-generated method stub
  if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
    setContentView(R.layout.imageswitch);
    //橫屏
  } else {
    setContentView(R.layout.editcontact);//豎屏
  }
  
  super.onConfigurationChanged(newConfig);
}


這樣就可以實現不重啓activity,實現橫豎屏切換了。
解決Android手機 螢幕橫豎屏切換
Android中當螢幕橫豎屏切換時,Activity的生命周期是重新載入(說明當前的Activity給銷毀了,但又重新執行載入),怎麽使螢幕橫豎屏切換時,當前的Activity不銷毀呢?
1. 在AndroidManifest.xml中爲Activity設置configChanges屬性,

application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>


configChanges有如下選項: 1. orientation :螢幕在縱向和橫向間旋轉, 2. keyboardHidden:鍵盤顯示或隱藏 ,3.fontScale:用戶變更了首選的字體大小 4.locale : 用戶選擇了不同的語言設定,5. keyboard :鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤 6. touchscreen或navigation:鍵盤或導航方式變化,
如果缺少了keyboardHidden選項 不能防止Activity的銷毀,並且在之後提到的onConfigurationChanged事件中 只能捕獲豎屏變橫屏的事件 不能捕獲橫屏變豎屏


2. 在對應的Activity中重寫:onConfigurationChanged 方法:

public class MainActivity extends Activity {
  private TextView textView;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.i("--Main--", "onCreate");
    textView=(TextView)findViewById(R.id.tv_id);
  }
  
  
  @Override
  public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Log.i("--Main--", "onConfigurationChanged");
    if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
      textView.setText("當前螢幕爲橫屏");
    }else{
      textView.setText("當前螢幕爲豎屏");
    }
  }
  
}


布局文件就是一個簡單的TextView此處不給出,
效果如下:
關于Android橫豎屏切換及Activity重啓周期的總結

關于Android橫豎屏切換及Activity重啓周期的總結

日志列印:

關于Android橫豎屏切換及Activity重啓周期的總結

從日志中可以分析出螢幕橫豎屏切換時Activity並沒有銷毀,當然你也可以運行專案在onCreate方法打個斷點,執行發現onCreate方法只是在剛開始進入時執行,螢幕橫豎屏切換時,已經不會在執行,因此可在onConfigurationChanged方法中下點文章!
注:如果專案不需要螢幕切換時可以設置爲
1. android:screenOrientation="portrait" 始終以豎屏顯示
2. android:screenOrientation="landscape" 始終以橫屏顯示
上面的配置文件設置螢幕橫豎屏,下面是代碼去控制螢幕橫豎屏的:

private OnClickListener onClick=new OnClickListener() {
  @Override
  public void onClick(View v) {
    //設置螢幕爲橫屏
    if(v==butLandscrpe){
      MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    //設置爲置螢幕爲豎屏
    }else{
      MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
  }
};
//監聽系統設置的更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  String message=newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE ? "螢幕設置爲:橫屏" : "螢幕設置爲:豎屏";
  showToast(message);
}


橫豎屏切換時候Activity的生命周期
1、新建一個Activity,並把各個生命周期列印出來
2、運行Activity,得到如下信息
onCreate-->onStart-->onResume-->
3、按crtl+f12切換成橫屏時
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
4、再按crtl+f12切換成豎屏時,發現列印了兩次相同的log
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
5、修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",執行步驟3
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
6、再執行步驟4,發現不會再列印相同信息,但多列印了一行onConfigChanged
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onConfigurationChanged-->
7、把步驟5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",執行步驟3,就只列印onConfigChanged
onConfigurationChanged-->
8、執行步驟4
onConfigurationChanged-->onConfigurationChanged-->
總結:
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
3、設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

總結一下整個Activity的生命周期
補充一點,當前Activity産生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變
Activity運行時按下HOME鍵(跟被完全覆蓋是一樣的):onSaveInstanceState --> onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆蓋只是失去焦點:onPause--->onResume
如何讓Android橫豎屏切換時不銷毀當前activity
我們都知道android 螢幕橫向或豎向相互轉換的時候會銷毀當前的Activity 然後重啓它。
爲了橫豎屏切換時不銷毀當前Activity 我來介紹兩種方法。
方法一:不允許橫豎屏切換:
實現方法: Activity中還有一屬性和螢幕方向有關:

android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nosensor"]
在Mainifest.xml的Activity元素中增加這麽一個屬性:
android:screenOrientation=”portrait”則無論手機如何變動,擁有這個屬性的activity都將是豎屏顯示。
android:screenOrientation=”landscape”,爲橫屏顯示。


//--------------------------------------------------------------------------------------------
方法二:
首先在Mainifest.xml的Activity元素中加入android:configChanges=”orientation|keyboardHidden”屬性:
加入這條屬性的含義是,應用程序將會處理螢幕方向和鍵盤狀態(推出或合上)信息的改動。
但對于其他的設備配置信息的改動則會由Android系統來處理(銷毀當前Activity,然後重啓一個新的Activity實例)
然後 在java代碼的activity子類中加入配置信息改動的處理代碼:

//-----------------------------------------------------------------------------------------
@Override public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
// 檢測螢幕的方向:縱向或橫向
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
{
//當前爲橫屏, 在此處添加額外的處理代碼
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
//當前爲豎屏, 在此處添加額外的處理代碼
}
//檢測實體鍵盤的狀態:推出或者合上
if (newConfig.hardKeyboardHidden ) == Configuration.HARDKEYBOARDHIDDEN_NO)
{
//實體鍵盤處于推出狀態,在此處添加額外的處理代碼
} else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES)
{
//實體鍵盤處于合上狀態,在此處添加額外的處理代碼
}
}


更多相關文章
  • Android 5.0系統app經常重啓怎麽辦呢?最近有一部份網友把自家手機升級了5.0了,但發現升級之後很多軟件不停閃退重啓了,那麽這種閃退問題如何解決呢?安卓5.0應用後期頻繁重啓很多用戶報告說,安卓5.0中的應用似乎會在後台頻繁重啓,明顯不正常,而且如果設備長時間不重新啓動一次,系統和應用的效
  • 下面我们一起来看一个WPF中判断surface+win8下的横屏 竖屏状态的一些方法整理,希望此方法来给各位朋友带来一些帮助哦.今天在做surface2+win8.1的一个wpf程序,程序固定了分辨率和高度宽度了,也就是说直接不支持竖屏模式了.当设备从横屏切换到竖屏时,WPF程序变小,有些控件被覆盖
  • GTA5 PC版切換角色死機問題解決辦法
    GTA5遊戲于家比較多但問題也不少了,今天小編在電腦版本的GTA5遊戲時發現切換角色出現死機情況了,下面我們來看切換角色死機解決方法 1. 遇到常會當機,或者程序執行沒有回應的時候,把畫面切回800X600.2. 遇到主線任務轉場或切換角色當機時候,按鍵盤的WIN回到桌面約3秒.... 接著在次切換 ...
  • 在linux中reboot與shutdown命令是可以實現手機重啓/關機操作了,下面小編來爲各位簡單的介紹一下reboot與shutdown重啓/關機命令詳解,希望例子能幫助到大家.我們在操作Linux vps/伺服器的時候肯定會有需要重啓系統,或者關閉系統等操作.有些用戶是直接到VPS主機商家面板 ...
  • 在linux中關機與重啓伺服器都是使用了shutdown命令,只是後面的參考不同罷了,下面大家可參考參考.重啓命令:1.reboot2.shutdown -r now 立刻重啓(root用戶使用)3.shutdown -r 10 過10分鍾自動重啓(root用戶使用)4.shutdown -r 20 ...
  • HTML5  Screen Orientation API實現橫屏或豎屏
    在手機開發中橫屏或豎屏是我們常用到的兩種方式了,因爲現在的智能手機都可以根據用戶的一個側重
  • Android中ViewPage+Fragment頂部及FragmentTabHost+Fragment底部 滑動切換
    本文我們將介紹在Android開發很常見的tab滑動切換效果,本文講了兩例,一個是ViewPage+Fragment實現區域頂部tab滑動切換,還有一個是FragmentTabHost+Fragment實現底部tab切換,歡迎交流.Android開發中ViewPage+Fragment實現區域頂部t ...
  • Android 4.2 實現自動定時切換飛行模式的方法
    在學Android開發時,自己開發了一個實現自動定時切換飛行模式的功能,這個功能作用應該不
一周排行
  • 下文來爲各位整理一段php判斷是android還是ios還是wp的訪問網站例子,非常 的實用希望對各位朋友會有所幫助.在php中可以用$_SERVER['HTTP_USER_AGENT']來區分是android.io ...
  • 本文章總結了關于Java中super關鍵字用法有需要了解super關鍵字的朋友可參考一下.有很對書上講super所表示的是父類對象的引用(我現在有點置疑這個說法,如果它表示父類對象的引用, 那麽照理說System.o
  • excel導入mysql數據庫我整理了兩種辦法,一種就是使用PHP-ExcelReader來導入,另一種是把excel轉換成csv文件直接使用php相關函數導入即可.昨晚一個客戶聯系我做網站,提出的要求是需要把客戶提 ...
  • mysqlhotcopy備份比起系統自帶的備份可強大了些,它是采用SQL級別的備份機制,備份成的文件是sql了,這個都差不多,mysqlhotcopy備份支持的存儲引擎常用的有MyISAM,innodb,下面一起來看
  • 前面我有講過利用其它的算法生成簽名,下面我們同樣在利用openssl生成簽名,希望此文章對各位同學會有所幫助哦.實例 代碼如下 <?php /** * 根據原文生成簽名內容 * * @param string ...
  • Bugzilla 是一個開源的缺陷跟蹤系統,可以在 Nginx+FastCGI的方式來運行我們的Bugzilla系統,現在我們來看看在Nginx+FastCGI運行Bugzilla如何優化.我用Nginx+FastC ...
  • C#中WebClient實現文件下載實現方案
    下面本文章介紹幾個利用C#中WebClient實現文件下載並且還可以獲取下載文件速度程序代 ...
  • mysql Int數據類型長度學習筆記 有需要了解的朋友可參考一下本文章.1.數值類型 列類型 需要的存儲量 TINYINT 1 字節 SMALLINT 2 個字節 MEDIUMINT 3 個字節 INT 4 個字節 ...
  • 夢幻西遊地府海底秘境18~25怎麽通關 海底秘境18~25通關方法分享
    在夢幻西遊手機版的這一款遊戲裏面,地府海底秘境18~25關卡到底該怎麽樣通關呢?今天小編就
  • 本文章來給各位同學介紹一篇關于公司技術總監與經理工作總結與工作計劃014年,如果你是這個職位的這篇文章非常不錯哦.2012年終總結2012年是夢想啓航的一年,今年以來,從我的工作職責方面,我很感激公司領導