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

來源:互聯網
上載者:User

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

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

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

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

(1)通過修改AndroidMainfest.xml設定檔

修改Android/app/mainfests/AndroidMainfest.xml下的設定檔如下:

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.day18"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".Main2Activity" //添加screenOrientation屬性(portrait為保持豎屏,landscape為保持橫屏)  android:screenOrientation="landscape">  <intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  </intent-filter> </activity> </application></manifest>

(2)通過java代碼實現:

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

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

二、Activity轉換方向時資料的儲存

下面我們展示Activity轉換方向時未儲存資料的情況:

示範中,我們通過記錄按鈕的點擊次數(土司)來判斷資料是否被儲存

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

當我們設定儲存資料後,示範情況如下:

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

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

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

(1)onSaveInstanceState詳解

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

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Toast;/** * Created by panchengjia on 2016/12/9. */public class Main2Activity extends AppCompatActivity { int num=1;//初始點擊次數為1 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); if(savedInstanceState!=null){  num=savedInstanceState.getInt("data"); } Log.i("Tag","onCreate"); } //設定點擊事件土司記錄資料 public void show(View v){ Toast.makeText(this, num++ +"", Toast.LENGTH_SHORT).show(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("data",num); Log.i("Tag","onSaveInstanceState"); } @Override protected void onStart() { super.onStart(); Log.i("Tag","onStart"); } @Override protected void onResume() { super.onResume(); Log.i("Tag","onResume"); } @Override protected void onRestart() { super.onRestart(); Log.i("Tag","onRestart"); } @Override protected void onPause() { super.onPause(); Log.i("Tag","onPause"); } @Override protected void onStop() { super.onStop(); Log.i("Tag","onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("Tag","onDestroy"); }}

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

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

(2)修改AndroidManifest.xml設定檔

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

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.administrator.day18"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".Main2Activity" //添加configChanges屬性  android:configChanges="orientation|keyboard|screenSize">  <intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  </intent-filter> </activity> <!--<activity android:name=".Main2Activity"></activity>--> </application></manifest>

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

@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i("Tag","onConfigurationChanged"); }

旋轉螢幕前後Log如下(示範兩次旋轉):

從Log中可以得知螢幕(Acticity)旋轉時,使用第二種方法儲存資料不會銷毀Activity,不用重複的銷毀建立Activity從而達到最佳化記憶體效能的目的。建議使用這種方法

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的協助,同時也希望多多支援雲棲社區!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.