Android中Activity運行時屏幕方向與顯示方式詳解

来源:http://www.cnblogs.com/panhouye/archive/2016/12/09/6151965.html
-Advertisement-
Play Games

現在我們的手機一般都內置有方向感應器,手機屏幕會根據所處位置自動進行橫豎屏切換(前提是未鎖定屏幕方向)。但有時我們的應用程式僅限在橫屏或者豎屏狀態下才可以運行,此時我們需要鎖定該程式Activity運行時的屏幕方向。還有就是在我們用手機觀看視頻時,隨意的進行橫豎屏切換,但播放進度不會隨著屏幕的轉換而 ...


現在我們的手機一般都內置有方向感應器,手機屏幕會根據所處位置自動進行橫豎屏切換(前提是未鎖定屏幕方向)。但有時我們的應用程式僅限在橫屏或者豎屏狀態下才可以運行,此時我們需要鎖定該程式Activity運行時的屏幕方向。還有就是在我們用手機觀看視頻時,隨意的進行橫豎屏切換,但播放進度不會隨著屏幕的轉換而從頭開始播放,為了實現這個功能,我們就需要在Activity轉換時對當前數據進行保存。

現在根據以上兩種需求,個人提出以下解決方案:

一、鎖定Activity運行時屏幕方向,如下圖(演示鎖定橫屏):

我們可以通過以下兩種方式實現鎖定Activity運行時屏幕的方向:

(1)通過修改AndroidMainfest.xml配置文件

修改Android/app/mainfests/AndroidMainfest.xml下的配置文件如下:

<activity>節點的android:screenOrientation屬性可以完成該任務(portrait為保持豎屏,landscape為保持橫屏)

 

 1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 2     package="com.example.administrator.day18">
 3     <application
 4         android:allowBackup="true"
 5         android:icon="@mipmap/ic_launcher"
 6         android:label="@string/app_name"
 7         android:supportsRtl="true"
 8         android:theme="@style/AppTheme">
 9         <activity android:name=".Main2Activity"
10         //添加screenOrientation屬性(portrait為保持豎屏,landscape為保持橫屏)
11             android:screenOrientation="landscape">
12             <intent-filter>
13                 <action android:name="android.intent.action.MAIN" />
14 
15                 <category android:name="android.intent.category.LAUNCHER" />
16             </intent-filter>
17         </activity>
18     </application>
19 </manifest>

 

(2)通過java代碼實現:

 1 import android.content.pm.ActivityInfo;
 2 import android.os.Bundle;
 3 import android.support.annotation.Nullable;
 4 import android.support.v7.app.AppCompatActivity;
 5 /**
 6  * Created by panchengjia on 2016/12/9.
 7  */
 8 public class Test extends AppCompatActivity {
 9     @Override
10     protected void onCreate(@Nullable Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main2);
13         //添加setRequestedOrientation方法實現鎖定橫屏(portrait為保持豎屏,landscape為保持橫屏)
14         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
15     }
16 }

現在第一種需求通過修改配置文件以及java代碼的方式實現,但這裡要註意的是當同時在配置文件以及java文件中設置了方向鎖定時,系統會以配置文件設置為準(可以理解為配置文件優先順序高於java代碼)

 

二、Activity轉換方向時數據的保存

 

下麵我們展示Activity轉換方向時未保存數據的情況:

演示中,我們通過記錄按鈕的點擊次數(土司)來判斷數據是否被保存

我們發現當屏幕(Acticity)由橫屏轉為豎屏時,數據未實現保存,繼續從0開始計數點擊次數。

當我們設置保存數據後,演示情況如下:

保存數據後,點擊數土司會繼續豎屏狀態的數據更新,而不是從零重新開始。

針對數據保存我們同樣有兩種方法實現,分別為在java代碼中使用onSaveInstanceState()方法以及在屬性。

下麵我們詳細分析這兩種方法的實現:

 

(1)onSaveInstanceState詳解

 

實現代碼如下(這裡寫了Activity的全部生命周期,並列印log用於分析性能):

 1 import android.support.v7.app.AppCompatActivity;
 2 import android.os.Bundle;
 3 import android.util.Log;
 4 import android.view.View;
 5 import android.widget.Toast;
 6 /**
 7  * Created by panchengjia on 2016/12/9.
 8  */
 9 public class Main2Activity extends AppCompatActivity {
10     int num=1;//初始點擊次數為1
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_main2);
15         if(savedInstanceState!=null){
16             num=savedInstanceState.getInt("data");
17         }
18         Log.i("Tag","onCreate");
19     }
20     //設置點擊事件土司記錄數據
21     public void show(View v){
22         Toast.makeText(this, num++ +"", Toast.LENGTH_SHORT).show();
23     }
24     @Override
25     protected void onSaveInstanceState(Bundle outState) {
26         super.onSaveInstanceState(outState);
27         outState.putInt("data",num);
28         Log.i("Tag","onSaveInstanceState");
29     }
30     @Override
31     protected void onStart() {
32         super.onStart();
33         Log.i("Tag","onStart");
34     }
35     @Override
36     protected void onResume() {
37         super.onResume();
38         Log.i("Tag","onResume");
39     }
40     @Override
41     protected void onRestart() {
42         super.onRestart();
43         Log.i("Tag","onRestart");
44     }
45     @Override
46     protected void onPause() {
47         super.onPause();
48         Log.i("Tag","onPause");
49     }
50     @Override
51     protected void onStop() {
52         super.onStop();
53         Log.i("Tag","onStop");
54     }
55     @Override
56     protected void onDestroy() {
57         super.onDestroy();
58         Log.i("Tag","onDestroy");
59     }
60 }

功能實現的核心代碼為protected void onSaveInstanceState(Bundle outState)方法。Activity旋轉前後的Log如下:

從Log中可以得知屏幕(Acticity)旋轉時,會銷毀之前的Activity,然後重建旋轉後的Activity。

(2)修改AndroidManifest.xml配置文件

在AndroidManifest.xml中添加configChanges屬性,如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.administrator.day18">
 4     <application
 5         android:allowBackup="true"
 6         android:icon="@mipmap/ic_launcher"
 7         android:label="@string/app_name"
 8         android:supportsRtl="true"
 9         android:theme="@style/AppTheme">
10         <activity android:name=".Main2Activity"
11         //添加configChanges屬性
12             android:configChanges="orientation|keyboard|screenSize">
13             <intent-filter>
14                 <action android:name="android.intent.action.MAIN" />
15 
16                 <category android:name="android.intent.category.LAUNCHER" />
17             </intent-filter>
18         </activity>
19         <!--<activity android:name=".Main2Activity"></activity>-->
20     </application>
21 </manifest>

在java中添加對應的onConfigurationChanged()方法用於Log列印分析,方法本身在功能實現上無實際意義:

 

1 @Override
2 public void onConfigurationChanged(Configuration newConfig) {
3    super.onConfigurationChanged(newConfig);
4    Log.i("Tag","onConfigurationChanged");
5 }

屏幕旋轉前後Log如下(演示兩次旋轉):

從Log中可以得知屏幕(Acticity)旋轉時,使用第二種方法保存數據不會銷毀Activity,不用重覆的銷毀建立Activity從而達到優化記憶體性能的目的。建議使用這種方法

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以後用起來就方便了把 css文件引入 <link rel="stylesheet" type="text/css" href="css/jquery.mCustomScrollbar.css"> js引入 <script type="text/javascript" src="js/jquery.m ...
  • 開始記錄js學習; udacity,edx上不去; ...
  • 移動端響應式頁面開發說簡單也簡單,根據屏幕尺寸調節根字體大小。 大寬度用%,高度和小寬度全部使用rem,簡單粗暴。 之前閱讀過大漠老師的 "使用Flexible實現手淘H5頁面的終端適配" ,介紹了手淘項目的H5製作規範。 在手淘的設計師和前端開發協作過程中:手淘設計師常選擇iPhone6作為基準設 ...
  • [1]操作說明 [2]目錄參照 [3]目錄連接 [4]目錄顯示 [5]目錄樣式 [6]點擊事件 [7]隱藏功能 [8]滾輪功能 [9]拖拽功能 [10]代碼展示 ...
  • 輪播圖也涉及到觸摸和觸摸反饋,同時,AlloyTouch可以把慣性運動打開或者關閉,並且設置min和max為運動區域,超出會自動回彈。 除了一般的豎向滾動,AlloyTouch也可以支持橫向滾動,甚至任何屬性的運動,因為它的設計的本質就是屬性無關,觸摸可以反饋到任何屬性的運動。所以 "AlloyTo ...
  • ECMA-262用於操作數據值的操作符包括: 算術操作符 位操作符 關係操作符 相等操作符 ECMAScript操作符的不同之處在於:它能夠適用於很多值,包括字元串,數字值,布爾值,甚至是對象。(在應用於對象時,相應的操作符通常會調用對象的valueOf()和(或)toString()方法,以便取得 ...
  • var aLi = document.querySelectorAll('.article-tab li'); for (var i = 0; i <= aLi.length; i++) { (function(){ var p = i aLi[i].onclick = function() { a ...
  • 線上預覽 下載地址 實例代碼 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...