本文主要对如何控制 Android 中 Activity 运行时屏幕方向与显示方式进行详细全面的实例讲解。具有很好的参考价值,需要的朋友一起来看下吧
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向)。但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序 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 从而达到优化内存性能的目的。建议使用这种方法
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持 PHPERZ!
来源: http://www.phperz.com/article/17/0314/314549.html