国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

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

2019-12-12 04:16:48
字體:
供稿:網(wǎng)友

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

現(xiàn)在根據(jù)以上兩種需求,個人提出以下解決方案:

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

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

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

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

<activity>節(jié)點的android:screenOrientation屬性可以完成該任務(wù)(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代碼實現(xiàn):

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方法實現(xiàn)鎖定橫屏(portrait為保持豎屏,landscape為保持橫屏) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }}

現(xiàn)在第一種需求通過修改配置文件以及java代碼的方式實現(xiàn),但這里要注意的是當(dāng)同時在配置文件以及java文件中設(shè)置了方向鎖定時,系統(tǒng)會以配置文件設(shè)置為準(zhǔn)(可以理解為配置文件優(yōu)先級高于java代碼

二、Activity轉(zhuǎn)換方向時數(shù)據(jù)的保存

下面我們展示Activity轉(zhuǎn)換方向時未保存數(shù)據(jù)的情況:

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

我們發(fā)現(xiàn)當(dāng)屏幕(Acticity)由橫屏轉(zhuǎn)為豎屏?xí)r,數(shù)據(jù)未實現(xiàn)保存,繼續(xù)從0開始計數(shù)點擊次數(shù)。

當(dāng)我們設(shè)置保存數(shù)據(jù)后,演示情況如下:

保存數(shù)據(jù)后,點擊數(shù)土司會繼續(xù)豎屏狀態(tài)的數(shù)據(jù)更新,而不是從零重新開始。

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

下面我們詳細(xì)分析這兩種方法的實現(xiàn):

(1)onSaveInstanceState詳解

實現(xiàn)代碼如下(這里寫了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;//初始點擊次數(shù)為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"); } //設(shè)置點擊事件土司記錄數(shù)據(jù) 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"); }}

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

從Log中可以得知屏幕(Acticity)旋轉(zhuǎn)時,會銷毀之前的Activity,然后重建旋轉(zhuǎn)后的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中添加對應(yīng)的onConfigurationChanged()方法用于Log打印分析,方法本身在功能實現(xiàn)上無實際意義:

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

屏幕旋轉(zhuǎn)前后Log如下(演示兩次旋轉(zhuǎn)):

從Log中可以得知屏幕(Acticity)旋轉(zhuǎn)時,使用第二種方法保存數(shù)據(jù)不會銷毀Activity,不用重復(fù)的銷毀建立Activity從而達(dá)到優(yōu)化內(nèi)存性能的目的。建議使用這種方法

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持武林網(wǎng)!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 湘西| 双城市| 新沂市| 郧西县| 镇远县| 武平县| 台江县| 井陉县| 黔东| 泗阳县| 乐山市| 布尔津县| 洛川县| 龙川县| 电白县| 顺义区| 河曲县| 溧阳市| 常德市| 磴口县| 合山市| 宣汉县| 漾濞| 丽水市| 方正县| 云和县| 台州市| 黄大仙区| 崇文区| 龙海市| 阜平县| 米脂县| 嘉善县| 东明县| 江都市| 龙岩市| 青铜峡市| 岗巴县| 博乐市| 玉溪市| 申扎县|