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

我們可以通過(guò)以下兩種方式實(shí)現(xiàn)鎖定Activity運(yùn)行時(shí)屏幕的方向:
(1)通過(guò)修改AndroidMainfest.xml配置文件
修改Android/app/mainfests/AndroidMainfest.xml下的配置文件如下:
<activity>節(jié)點(diǎn)的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)通過(guò)java代碼實(shí)現(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方法實(shí)現(xiàn)鎖定橫屏(portrait為保持豎屏,landscape為保持橫屏)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
現(xiàn)在第一種需求通過(guò)修改配置文件以及java代碼的方式實(shí)現(xiàn),但這里要注意的是當(dāng)同時(shí)在配置文件以及java文件中設(shè)置了方向鎖定時(shí),系統(tǒng)會(huì)以配置文件設(shè)置為準(zhǔn)(可以理解為配置文件優(yōu)先級(jí)高于java代碼)
二、Activity轉(zhuǎn)換方向時(shí)數(shù)據(jù)的保存
下面我們展示Activity轉(zhuǎn)換方向時(shí)未保存數(shù)據(jù)的情況:
演示中,我們通過(guò)記錄按鈕的點(diǎn)擊次數(shù)(土司)來(lái)判斷數(shù)據(jù)是否被保存

我們發(fā)現(xiàn)當(dāng)屏幕(Acticity)由橫屏轉(zhuǎn)為豎屏?xí)r,數(shù)據(jù)未實(shí)現(xiàn)保存,繼續(xù)從0開(kāi)始計(jì)數(shù)點(diǎn)擊次數(shù)。
當(dāng)我們?cè)O(shè)置保存數(shù)據(jù)后,演示情況如下:

保存數(shù)據(jù)后,點(diǎn)擊數(shù)土司會(huì)繼續(xù)豎屏狀態(tài)的數(shù)據(jù)更新,而不是從零重新開(kāi)始。
針對(duì)數(shù)據(jù)保存我們同樣有兩種方法實(shí)現(xiàn),分別為在java代碼中使用onSaveInstanceState()方法以及在屬性。
下面我們?cè)敿?xì)分析這兩種方法的實(shí)現(xiàn):
(1)onSaveInstanceState詳解
實(shí)現(xiàn)代碼如下(這里寫(xiě)了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;//初始點(diǎn)擊次數(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è)置點(diǎn)擊事件土司記錄數(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");
}
}
功能實(shí)現(xiàn)的核心代碼為protected void onSaveInstanceState(Bundle outState)方法。Activity旋轉(zhuǎn)前后的Log如下:

從Log中可以得知屏幕(Acticity)旋轉(zhuǎn)時(shí),會(huì)銷(xiāo)毀之前的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中添加對(duì)應(yīng)的onConfigurationChanged()方法用于Log打印分析,方法本身在功能實(shí)現(xiàn)上無(wú)實(shí)際意義:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("Tag","onConfigurationChanged");
}
屏幕旋轉(zhuǎn)前后Log如下(演示兩次旋轉(zhuǎn)):

從Log中可以得知屏幕(Acticity)旋轉(zhuǎn)時(shí),使用第二種方法保存數(shù)據(jù)不會(huì)銷(xiāo)毀Activity,不用重復(fù)的銷(xiāo)毀建立Activity從而達(dá)到優(yōu)化內(nèi)存性能的目的。建議使用這種方法
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- Android中fragment與activity之間的交互(兩種實(shí)現(xiàn)方式)
- Android設(shè)置Activity背景為透明style的簡(jiǎn)單方法(必看)
- Android基于OpenGL的GLSurfaceView創(chuàng)建一個(gè)Activity實(shí)現(xiàn)方法
- Android中activity跳轉(zhuǎn)按鈕事件的四種寫(xiě)法
- Android activity堆棧及管理實(shí)例詳解
- Android使用Dialog風(fēng)格彈出框的Activity
- Android中g(shù)etActivity()為null的解決辦法
- 不依賴(lài)于Activity的Android全局懸浮窗的實(shí)現(xiàn)
- Android實(shí)現(xiàn)Activity水平和垂直滾動(dòng)條的方法
- Android使用Theme自定義Activity進(jìn)入退出動(dòng)畫(huà)的方法
- Android開(kāi)發(fā)中Activity創(chuàng)建跳轉(zhuǎn)及傳值的方法
相關(guān)文章
Android 多層嵌套后的 Fragment 懶加載實(shí)現(xiàn)示例
這篇文章主要介紹了Android 多層嵌套后的 Fragment 懶加載實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
android 實(shí)現(xiàn)控件左右或上下抖動(dòng)教程
這篇文章主要介紹了android 實(shí)現(xiàn)控件左右或上下抖動(dòng)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android 抽屜效果的導(dǎo)航菜單實(shí)現(xiàn)代碼實(shí)例
本篇文章主要介紹了Android 抽屜效果的導(dǎo)航菜單實(shí)現(xiàn)代碼實(shí)例,這種側(cè)滑的抽屜效果的菜單很好,有興趣的可以了解一下。2016-12-12
Android Studio中的Gradle依賴(lài)深入講解
Android Studio由于使用了gradle的進(jìn)行項(xiàng)目構(gòu)建,使我們開(kāi)發(fā)app方便很多,下面這篇文章主要給大家介紹了關(guān)于Android Studio中Gradle依賴(lài)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09
基于Flutter實(shí)現(xiàn)風(fēng)車(chē)加載組件的制作
Flutter官方提供了諸如 CircularProgressIndicator和 LinearProgressIndicator兩種常見(jiàn)的加載指示組件,但是說(shuō)實(shí)話,實(shí)在太普通,所以本文將用Flutter自定義一個(gè)風(fēng)車(chē)加載組件,需要的可以參考一下2022-03-03
Android權(quán)限機(jī)制帶來(lái)的一些安全問(wèn)題介紹
這篇文章主要介紹了Android權(quán)限機(jī)制帶來(lái)的一些安全問(wèn)題介紹,本文講解了權(quán)限機(jī)制的缺陷和不足、樹(shù)立權(quán)限意識(shí)、越過(guò)權(quán)限機(jī)制等內(nèi)容,需要的朋友可以參考下2015-04-04

