android 判断方向锁定,详解Android中Activity运行时屏幕方向与显示方式

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

现在根据以上两种需求,个人提出以下解决方案:

一、锁定Activity运行时屏幕方向,如下图(演示锁定横屏):

97e8ef021bf3a7165520477780fe5d3a.gif

我们可以通过以下两种方式实现锁定Activity运行时屏幕的方向:

(1)通过修改AndroidMainfest.xml配置文件

修改Android/app/mainfests/AndroidMainfest.xml下的配置文件如下:

节点的android:screenOrientation属性可以完成该任务(portrait为保持竖屏,landscape为保持横屏)

package="com.example.administrator.day18">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

//添加screenOrientation属性(portrait为保持竖屏,landscape为保持横屏)

android:screenOrientation="landscape">

(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转换方向时未保存数据的情况:

演示中,我们通过记录按钮的点击次数(土司)来判断数据是否被保存

5b6eb117241c800cd9b4e2cfb18e173f.gif

我们发现当屏幕(Acticity)由横屏转为竖屏时,数据未实现保存,继续从0开始计数点击次数。

当我们设置保存数据后,演示情况如下:

41e14ff37167a60298529c9dac66bbb7.gif

保存数据后,点击数土司会继续竖屏状态的数据更新,而不是从零重新开始。

针对数据保存我们同样有两种方法实现,分别为在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如下:

bcb6ea5f22aef6f390b58a1da304b198.png

从Log中可以得知屏幕(Acticity)旋转时,会销毁之前的Activity,然后重建旋转后的Activity。

(2)修改AndroidManifest.xml配置文件

在AndroidManifest.xml中添加configChanges属性,如下:

package="com.example.administrator.day18">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

//添加configChanges属性 android:configChanges="orientation|keyboard|screenSize">

在java中添加对应的onConfigurationChanged()方法用于Log打印分析,方法本身在功能实现上无实际意义:

@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

Log.i("Tag","onConfigurationChanged");

}

屏幕旋转前后Log如下(演示两次旋转):

3ae2c2d6a3f7674b2120df830c0a68f2.png

从Log中可以得知屏幕(Acticity)旋转时,使用第二种方法保存数据不会销毁Activity,不用重复的销毁建立Activity从而达到优化内存性能的目的。建议使用这种方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值