人生必须的知识就是引人向光明方面的明灯。这篇文章主要讲述Android中Activity运行时屏幕方向与显示方式详解相关的知识,希望能为你提供帮助。
现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向)。但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运行时的屏幕方向。还有就是在我们用手机观看视频时,随意的进行横竖屏切换,但播放进度不会随着屏幕的转换而从头开始播放,为了实现这个功能,我们就需要在Activity转换时对当前数据进行保存。
现在根据以上两种需求,个人提出以下解决方案:
一、锁定Activity运行时屏幕方向,如下图(演示锁定横屏):
文章图片
我们可以通过以下两种方式实现锁定Activity运行时屏幕的方向:
(1)通过修改androidMainfest.xml配置文件
修改Android/app/mainfests/AndroidMainfest.xml下的配置文件如下:
【Android中Activity运行时屏幕方向与显示方式详解】< activity> 节点的android:screenOrientation属性可以完成该任务(portrait为保持竖屏,landscape为保持横屏)
1 < manifest xmlns:android="http://schemas.android.com/apk/res/android" 2package="com.example.administrator.day18"> 3< application 4android:allowBackup="true" 5android:icon="@mipmap/ic_launcher" 6android:label="@string/app_name" 7android:supportsRtl="true" 8android:theme="@style/AppTheme"> 9< activity android:name=".Main2Activity" 10//添加screenOrientation属性(portrait为保持竖屏,landscape为保持横屏) 11android: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 10protected void onCreate(@Nullable Bundle savedInstanceState) { 11super.onCreate(savedInstanceState); 12setContentView(R.layout.activity_main2); 13//添加setRequestedOrientation方法实现锁定横屏(portrait为保持竖屏,landscape为保持横屏) 14setRequestedOrientation(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 { 10int num=1; //初始点击次数为1 11@Override 12protected void onCreate(Bundle savedInstanceState) { 13super.onCreate(savedInstanceState); 14setContentView(R.layout.activity_main2); 15if(savedInstanceState!=null){ 16num=savedInstanceState.getInt("data"); 17} 18Log.i("Tag","onCreate"); 19} 20//设置点击事件土司记录数据 21public void show(View v){ 22Toast.makeText(this, num++ +"", Toast.LENGTH_SHORT).show(); 23} 24@Override 25protected void onSaveInstanceState(Bundle outState) { 26super.onSaveInstanceState(outState); 27outState.putInt("data",num); 28Log.i("Tag","onSaveInstanceState"); 29} 30@Override 31protected void onStart() { 32super.onStart(); 33Log.i("Tag","onStart"); 34} 35@Override 36protected void onResume() { 37super.onResume(); 38Log.i("Tag","onResume"); 39} 40@Override 41protected void onRestart() { 42super.onRestart(); 43Log.i("Tag","onRestart"); 44} 45@Override 46protected void onPause() { 47super.onPause(); 48Log.i("Tag","onPause"); 49} 50@Override 51protected void onStop() { 52super.onStop(); 53Log.i("Tag","onStop"); 54} 55@Override 56protected void onDestroy() { 57super.onDestroy(); 58Log.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" 3package="com.example.administrator.day18"> 4< application 5android:allowBackup="true" 6android:icon="@mipmap/ic_launcher" 7android:label="@string/app_name" 8android:supportsRtl="true" 9android:theme="@style/AppTheme"> 10< activity android:name=".Main2Activity" 11//添加configChanges属性 12android: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) { 3super.onConfigurationChanged(newConfig); 4Log.i("Tag","onConfigurationChanged"); 5 }
屏幕旋转前后Log如下(演示两次旋转):
文章图片
从Log中可以得知屏幕(Acticity)旋转时,使用第二种方法保存数据不会销毁Activity,不用重复的销毁建立Activity从而达到优化内存性能的目的。建议使用这种方法
推荐阅读
- Android开发(关于WebView)
- Android LayoutInflater详解
- android有返回结果的 Activity
- android activity ImageView全屏设置
- android 设置横屏竖屏
- Android开发-基本概念小整理为了面试的小伙伴们所准备~~
- JavaScript布尔构造函数属性
- 如何使用递归对栈进行排序(算法实现)
- 如何使用MoviePy合成视频(设置单个剪辑的开始时间)