全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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


# android  # activity方向  # 获取屏幕方向  # Android中fragment与activity之间的交互(两种实现方式)  # Android设置Activity背景为透明style的简单方法(必看)  # Android基于OpenGL的GLSurfaceView创建一个Activity实现方法  # Android中activity跳转按钮事件的四种写法  # Android activity堆栈及管理实例详解  # Android使用Dialog风格弹出框的Activity  # Android中getActivity()为null的解决办法  # 不依赖于Activity的Android全局悬浮窗的实现  # Android实现Activity水平和垂直滚动条的方法  # Android使用Theme自定义Activity进入退出动画的方法  # Android开发中Activity创建跳转及传值的方法  # 配置文件  # 两种  # 的是  # 是在  # 点击数  # 两次  # 感应器  # 是从  # 我们可以  # 而不  # 要注意  # 用手  # 才可以  # 写了  # 分别为  # 当我们  # 种方法  # 有两种  # 仅限  # 这两种 


相关文章: 定制建站哪家更专业可靠?推荐榜单揭晓  如何在IIS服务器上快速部署高效网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  北京企业网站设计制作公司,北京铁路集团官方网站?  微信小程序 五星评分(包括半颗星评分)实例代码  如何在企业微信快速生成手机电脑官网?  建站之星上传入口如何快速找到?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何在阿里云域名上完成建站全流程?  如何选择最佳自助建站系统?快速指南解析优劣  javascript中的try catch异常捕获机制用法分析  linux top下的 minerd 木马清除方法  完全自定义免费建站平台:主题模板在线生成一站式服务  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  招贴海报怎么做,什么是海报招贴?  如何在阿里云ECS服务器部署织梦CMS网站?  c# 服务器GC和工作站GC的区别和设置  家庭建站与云服务器建站,如何选择更优?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  已有域名和空间,如何快速搭建网站?  TestNG的testng.xml配置文件怎么写  网站图片在线制作软件,怎么在图片上做链接?  网站制作壁纸教程视频,电脑壁纸网站?  建站之星如何快速解决建站难题?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  制作网站的模板软件,网站怎么建设?  建站之星展会模版如何一键下载生成?  实现虚拟支付需哪些建站技术支撑?  如何选择高性价比服务器搭建个人网站?  如何在景安服务器上快速搭建个人网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  建站之星如何一键生成手机站?  如何在Windows虚拟主机上快速搭建网站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  宿州网站制作公司兴策,安徽省低保查询网站?  建站之星客服服务时间及联系方式如何?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  C#如何在一个XML文件中查找并替换文本内容  网站制作模板下载什么软件,ppt模板免费下载网站?  如何选择高效响应式自助建站源码系统?  怀化网站制作公司,怀化新生儿上户网上办理流程?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何通过FTP空间快速搭建安全高效网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。