zoukankan      html  css  js  c++  java
  • Android中Activity运行时屏幕方向与显示方式详解

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

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

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

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

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

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

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

     1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     2     package="com.example.administrator.day18">
     3     <application
     4         android:allowBackup="true"
     5         android:icon="@mipmap/ic_launcher"
     6         android:label="@string/app_name"
     7         android:supportsRtl="true"
     8         android:theme="@style/AppTheme">
     9         <activity android:name=".Main2Activity"
    10         //添加screenOrientation属性(portrait为保持竖屏,landscape为保持横屏)
    11             android:screenOrientation="landscape">
    12             <intent-filter>
    13                 <action android:name="android.intent.action.MAIN" />
    14 
    15                 <category android:name="android.intent.category.LAUNCHER" />
    16             </intent-filter>
    17         </activity>
    18     </application>
    19 </manifest>

    (2)通过java代码实现:

     1 import android.content.pm.ActivityInfo;
     2 import android.os.Bundle;
     3 import android.support.annotation.Nullable;
     4 import android.support.v7.app.AppCompatActivity;
     5 /**
     6  * Created by panchengjia on 2016/12/9.
     7  */
     8 public class Test extends AppCompatActivity {
     9     @Override
    10     protected void onCreate(@Nullable Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layout.activity_main2);
    13         //添加setRequestedOrientation方法实现锁定横屏(portrait为保持竖屏,landscape为保持横屏)
    14         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    15     }
    16 }

    现在第一种需求通过修改配置文件以及java代码的方式实现,但这里要注意的是当同时在配置文件以及java文件中设置了方向锁定时,系统会以配置文件设置为准(可以理解为配置文件优先级高于java代码)

    二、Activity转换方向时数据的保存

    下面我们展示Activity转换方向时未保存数据的情况:

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

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

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

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

    针对数据保存我们同样有两种方法实现,分别为在java代码中使用onSaveInstanceState()方法以及在属性。

    下面我们详细分析这两种方法的实现:

    (1)onSaveInstanceState详解

    实现代码如下(这里写了Activity的全部生命周期,并打印log用于分析性能):

     1 import android.support.v7.app.AppCompatActivity;
     2 import android.os.Bundle;
     3 import android.util.Log;
     4 import android.view.View;
     5 import android.widget.Toast;
     6 /**
     7  * Created by panchengjia on 2016/12/9.
     8  */
     9 public class Main2Activity extends AppCompatActivity {
    10     int num=1;//初始点击次数为1
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_main2);
    15         if(savedInstanceState!=null){
    16             num=savedInstanceState.getInt("data");
    17         }
    18         Log.i("Tag","onCreate");
    19     }
    20     //设置点击事件土司记录数据
    21     public void show(View v){
    22         Toast.makeText(this, num++ +"", Toast.LENGTH_SHORT).show();
    23     }
    24     @Override
    25     protected void onSaveInstanceState(Bundle outState) {
    26         super.onSaveInstanceState(outState);
    27         outState.putInt("data",num);
    28         Log.i("Tag","onSaveInstanceState");
    29     }
    30     @Override
    31     protected void onStart() {
    32         super.onStart();
    33         Log.i("Tag","onStart");
    34     }
    35     @Override
    36     protected void onResume() {
    37         super.onResume();
    38         Log.i("Tag","onResume");
    39     }
    40     @Override
    41     protected void onRestart() {
    42         super.onRestart();
    43         Log.i("Tag","onRestart");
    44     }
    45     @Override
    46     protected void onPause() {
    47         super.onPause();
    48         Log.i("Tag","onPause");
    49     }
    50     @Override
    51     protected void onStop() {
    52         super.onStop();
    53         Log.i("Tag","onStop");
    54     }
    55     @Override
    56     protected void onDestroy() {
    57         super.onDestroy();
    58         Log.i("Tag","onDestroy");
    59     }
    60 }

    功能实现的核心代码为protected void onSaveInstanceState(Bundle outState)方法。Activity旋转前后的Log如下:

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

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

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

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.administrator.day18">
     4     <application
     5         android:allowBackup="true"
     6         android:icon="@mipmap/ic_launcher"
     7         android:label="@string/app_name"
     8         android:supportsRtl="true"
     9         android:theme="@style/AppTheme">
    10         <activity android:name=".Main2Activity"
    11         //添加configChanges属性
    12             android:configChanges="orientation|keyboard|screenSize">
    13             <intent-filter>
    14                 <action android:name="android.intent.action.MAIN" />
    15 
    16                 <category android:name="android.intent.category.LAUNCHER" />
    17             </intent-filter>
    18         </activity>
    19         <!--<activity android:name=".Main2Activity"></activity>-->
    20     </application>
    21 </manifest>

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

    1 @Override
    2 public void onConfigurationChanged(Configuration newConfig) {
    3    super.onConfigurationChanged(newConfig);
    4    Log.i("Tag","onConfigurationChanged");
    5 }

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

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

  • 相关阅读:
    创建了对嵌入的互操作程序集间接引用,无法嵌入互操作类型
    演练:Office 编程(C# 和 Visual Basic)
    【MySQL案件】ERROR 1418
    Quartus II 11.0破发点(不同的是低版本号)
    Arduino 数码管LED驱动器 阵列方法
    HDU1312 Red and Black 解读
    UVA714- Copying Books(最大最小化)
    最大流量dinci模板
    Python 实现类似PHP的strip_tags功能,并能够定义他们自己的一套保留标记
    从源代码分析modelDriven拦截器和params拦截器和拦截器prepare 和paramsPrepareParamsStack拦截器栈(让你的Struts2代码更简洁——如何培养框架设计能力
  • 原文地址:https://www.cnblogs.com/panhouye/p/6151965.html
Copyright © 2011-2022 走看看