详解Android中Activity运行时屏幕方向与显示方式

详解Android中Activity运行时屏幕方向与显示方式,第1张

概述现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向)。但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运行时的屏

现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向)。但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序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从而达到优化内存性能的目的。建议使用这种方法

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的详解Android中Activity运行时屏幕方向与显示方式全部内容,希望文章能够帮你解决详解Android中Activity运行时屏幕方向与显示方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存