如何实现禁止配置更改activity重启

版权声明:转载请申明出处,谢谢 https://blog.csdn.net/qq_35495763/article/details/88027066

Update time:2019-2-28 Author :要你命三千又三千 type:学习笔记

问题:如何实现配置更改发生时,禁止Activity的重启。

解释:应用情形

  1. 如果应用在特定配置变更期间无需更新资源
  2. 并且因性能限制您需要尽量避免重启

解决方法:
声明 Activity 将自行处理配置变更,这样可以阻止系统重启 Activity。
举例

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

现在,当其中一个配置发生变化时,MyActivity 不会重启。
相反,MyActivity 会收到对 onConfigurationChanged() 的调用。向此方法传递 Configuration 对象指定新设备配置。您可以通过读取 Configuration 中的字段,确定新配置,然后通过更新界面中使用的资源进行适当的更改。调用此方法时,Activity 的 Resources 对象会相应地进行更新,以根据新配置返回资源,这样,您就能够在系统不重启 Activity 的情况下轻松重置 UI 的元素.

注意:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了 “orientation” 值以外,您还必须添加 “screenSize” 值。 也就是说,您必须声明 android:configChanges=“orientation|screenSize”。但是,如果您的应用面向 API 级别 12 或更低版本,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。

总结:从3.2开始纵横屏幕切换要想不重启activity则必须使用android:configChanges=“orientation|screenSize”
低版本的始终会自行处理不会重启。
参考的文章:https://developer.android.google.cn/guide/topics/resources/runtime-changes

使用一个更加紧凑的方式实现xml

情形:某些资源类型是由XML文件表示的多个复杂资源的组合。但是这些资源如果只是在单个文件中使用,那么过于分散的文件不易于资源管理。

解决方案:
使用AAPT来实现更加紧凑的方式。
三个分散文件。

res/drawable/avd.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/vectordrawable" >
    <target
        android:name="rotationGroup"
        android:animation="@anim/rotation" />
</animated-vector>

res/drawable/vectordrawable.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="64dp"
    android:width="64dp"
    android:viewportHeight="600"
    android:viewportWidth="600" >

   <group
        android:name="rotationGroup"
        android:pivotX="300.0"
        android:pivotY="300.0"
        android:rotation="45.0" >
        <path
            android:fillColor="#000000"
            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />

   </group>
</vector>

res/anim/rotation.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/android"
    android:duration="6000"
    android:propertyName="rotation"
    android:valueFrom="0"

   android:valueTo="360" />

但是使用AAPT来解决
res/drawable/avd.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt" >

    <aapt:attr name="android:drawable" >
        <vector
            android:height="64dp"
            android:width="64dp"
            android:viewportHeight="600"
            android:viewportWidth="600" >

           <group
                android:name="rotationGroup"
                android:pivotX="300.0"
                android:pivotY="300.0"
                android:rotation="45.0" >
                <path
                    android:fillColor="#000000"
                    android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />

           </group>
        </vector>
    </aapt:attr>

    <target android:name="rotationGroup">
        <aapt:attr name="android:animation" >
            <objectAnimator
                android:duration="6000"
                android:propertyName="rotation"
                android:valueFrom="0"
               android:valueTo="360" />
        </aapt:attr>
    </target>
</animated-vector>

作用:XML标记< aapt:attr >告诉AAPT标记的子项应被视为资源并提取到其自己的资源文件中。属性名称中的值指定在父标记中使用内联资源的位置。
AAPT将为所有内联资源生成资源文件和名称。使用此内联格式构建的应用程序与所有Android版本兼容。

猜你喜欢

转载自blog.csdn.net/qq_35495763/article/details/88027066