編輯:關於Android編程
現在我們的手機一般都內置有方向感應器,手機屏幕會根據所處位置自動進行橫豎屏切換(前提是未鎖定屏幕方向)。但有時我們的應用程序僅限在橫屏或者豎屏狀態下才可以運行,此時我們需要鎖定該程序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從而達到優化內存性能的目的。建議使用這種方法
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持本站!
實現ActionAction是struts2應用的核心,開發中需要大量的Action類,並在struts.xml中配置Action。Action中包含了對用戶請求的處理邏
大家先看下效果圖:Android為我們提供了四種應組件,分別為Activity、Service、Broadcast receivers和Content providers
本文介紹本文是翻譯自Google 官方課程 Building Apps with Connectivity & the Cloud 第二節 Performing
一.Path常用方法表 為了兼容性(偷懶) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法。忍不住吐槽一下,為啥看起來有些順手就能寫的重載方法