当前位置: 移动技术网 > IT编程>移动开发>Android > 详解Android中Activity运行时屏幕方向与显示方式

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

学生被困蓥华山,江苏女大学生组团卖淫,逆爱2后会无期

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网