详解Android中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从而达到优化内存性能的目的。建议使用这种方法

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

时间: 2024-09-12 03:41:31

详解Android中Activity运行时屏幕方向与显示方式的相关文章

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

现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运行时的屏幕方向.还有就是在我们用手机观看视频时,随意的进行横竖屏切换,但播放进度不会随着屏幕的转换而从头开始播放,为了实现这个功能,我们就需要在Activity转换时对当前数据进行保存. 现在根据以上两种需求,个人提出以下解决方案: 一.锁定Activity运行时屏幕方向,如下图(演示锁定横屏):

详解 Android 虚拟机 ART 运行时库 分析

在最新的Google I/O大会上,Google 发布了关于Android上最新的运行时库的情况.这就是Android RunTime (ART). ART 将会取代Dalvik虚拟机,成为Android平台上Java代码的执行工具.虽然自从Android KitKat,就有了一些关于ART的消息,但是基本都是一些新闻性质的,缺乏具体技术细节方面的介绍.本文尝试综合目前已有的各种消息,以及最新放出的 Android L 预览版本的ROM的情况,对ART运行时库做个详细的分析.     和IOS,

详解Android中Activity的四大启动模式实验简述

作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activity的四大启动模式. 演示效果如下: 第一步:实验前准备,相关配置文件以及Activity的建立 (1)AndroidMainfest.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <manifest

详解Android中的Service

Service简介: Service是被设计用来在后台执行一些需要长时间运行的操作. Android由于允许Service在后台运行,甚至在结束Activity后,因此相对来说,Service相比Activity拥有更高的优先级. 创建Service: 要创建一个最基本的Service,需要完成以下工作:1)创建一个Java类,并让其继承Service 2)重写onCreate()和onBind()方法 其中,onCreate()方法是当该Service被创建时执行的方法,onBind()是该S

详解Android中Intent对象与Intent Filter过滤匹配过程_Android

如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

详解Android中图片的三级缓存及实例

详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

详解Android中Handler的内部实现原理_Android

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文<详解Android中Handler的使用方法>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功

详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题 今天在项目中实现了一个效果,主要是画一个圆.为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可. 部分代码如下所示: package com.ef.smallstar.unitmap.widget; import android.content.res.Resources; import

详解Android中Fragment的两种创建方式_Android

fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入事件,并且可以在Activity运行时添加或者删除. 两个概念:Fragment.宿主 fragment的生命周期直接受其宿主activity的生命周期的影响.例如,一旦activity被暂停,它里面所有的fra