`
潇潇暮雨
  • 浏览: 29218 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android设备运行时配置更改处理

 
阅读更多

        android 设备在程序的运行过程中,设备的配置信息可能动态更新,如屏幕方向,设备本地语言。当这些参数一旦更改时,那么你的应用程序将重新启动(从ondestory----onCreate),在重启的过程中系统将会去加载程序提供的其他资源配置,以达到适应最新设备配置,让应用程序运行更好。

        要想程序在重启后能显示之前的信息,那么在activity的生命周期中保存重启之前的状态是非常重要的{调用 onSaveInstanceState()},在程序重启后,可以在onCreate()或者在onRestoryInstanceState()方法

恢复重启之前的状态。

        然而在某些情况,因配置改变而重新启动程序并且保存程序状态信息需要付出很大的代价,而且有可能产生非常不好的用户体验,那么此时你有两种选择:

使用状态变量保存状态更改信息
许程序在配置更改时重新启动,将程序的信息保存在状态变量中,并将新的状态变量传递到新的
activity 
    重启activity意味着你需要恢复大量的数据,重新建立网络连接或者其他的一些操作。要全面恢复
以前的状态信息有可能会导致用户体验的降低,当然你也不可能完全的恢复activity状态通过android的
onSaveInstanceState()方法将activity的状态信息保存在一个类型map的bundle中,因为bundle的设计
初衷并不能携带大量数据(如bitmap),它所能携带的数据是可以序列化和反序列化的。在activity重启时
可以通过保留activity重启前的状态信息来减少重启时activity的压力。
    1、重写onRetainNonConfigurationInstance()方法来保存你想保留的activity信息。
    2、当你的activity重启时,你可以通过调用getLastNonConfigurationInstance()方法恢复之
      前的状态。
    当android系统因设备配置改变要销毁你的activity时,系统会在onStop()和onDestory()之间调用
onRetainNonConfigurationInstance()方法,在该方法中你可以返回任意对象来保存你的activity
状态。
    假设有这样一个场景,当你的应用程序通过网络下载数据,在下载完成后设备的屏幕方向改变了,那
么你的activity将重新启动,再次不得不去重新下载数据,那么用户体验非常糟糕。此时你可以在
onRetainNonConfigurationInstance()方法中返回你已经加载的数据,在activity重新启动后在恢
复已加载的数据。
    
@OverridepublicObject onRetainNonConfigurationInstance(){
    final MyDataObject data = collectMyLoadedData();
    return data;
}

@Overridepublicvoid onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    finalMyDataObject data =(MyDataObject) getLastNonConfigurationInstance();
    if(data ==null){
        data = loadMyData();
    }
    ...}
注:当然在返回任何对象后,你不能给该activity绑定任何对象,这样会导致绑定的对象同activity生命
绑定,不能被垃圾回收机制回收,从而浪费大量的内存。

自己处理状态信息
   不允许程序在配置更改时重新启动,你可以接受到一个回调当设备配置信息改变时,然后手动更新的
activity
    如果你的应用程序不需要更新页面信息并且不想activity重新启动,那么需要定义activity去处理设
备配置更改以预防activity重新启动。
    手动预防哪一类配置改变你需要修改manifest.xml文件中activity 节点的配置,添加android:
configChanges属性,添加你要防止的设备更改值(参考)即可,你也可以添加多个属性值,它们之间
使用"|"隔开。
   <activityandroid:name=".MyActivity"
       android:configChanges="orientation|keyboardHidden"  //屏幕方向改变和键盘隐藏  
       android:label="@string/app_name">
如添加以上配置是,当屏幕方向改变或者键盘隐藏时,activity都不会重新启动,activity会调用onConfig
urationChange()方法,该方法中会传递一个新的configuration,同过读取configuration可以动态更新
你的UI显示,而不是重新启动Activity。    
@Override
publicvoid onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if(newConfig.orientation ==Configuration.ORIENTATION_LANDSCAPE){
        Toast.makeText(this,"landscape",Toast.LENGTH_SHORT).show();
    }elseif(newConfig.orientation ==Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this,"portrait",Toast.LENGTH_SHORT).show();
    }
注:在android3.2中方向改变需要添加screen size,3.2以下的版本不需要添加该属性
android:configChanges="orientation|screenSize"

 

分享到:
评论

相关推荐

    Android Studio使用Kotlin时,修改代码后运行不生效的解决方法

    结果却发现,修改 String 资源后,“运行”,修改的内容没有生效。一开始以为只是 String 资源是这样,于是试了下 kt 文件,结果发现“运行”也不能生效。 但是先 clean 了,再“运行”,却可以正常编译出来。查了...

    Android studio 运行main 函数的方法

    总结来说,要在Android Studio中运行包含`main()`函数的Java类,需要进行项目配置、修改Gradle设置、创建运行配置,并指定正确的主类。通过这种方式,你可以像在标准Java IDE中一样运行和调试Java代码。如果遇到问题...

    android_home 环境变量配置

    在进行Android开发时,为了能够顺利地使用各种工具和命令(如`adb`、`gradlew`等),我们需要正确配置环境变量,尤其是`ANDROID_HOME`环境变量。这个环境变量主要用于指向Android SDK的安装路径,使得系统能够在执行...

    导入Android源代码工程配置文件

    为了调试和测试,你还需要配置`adb`(Android Debug Bridge),这是一款多功能工具,用于连接和控制Android设备或模拟器。通过`adb`,你可以推送文件到设备,运行应用程序,甚至进行远程调试。 最后,了解`...

    Android root下修改设备分辨率

    在Android系统中,修改设备分辨率通常涉及到对系统底层设置的更改,这通常需要获取设备的Root权限。Root权限是Android系统中的超级用户权限,允许用户访问和修改系统核心文件,包括与显示分辨率相关的配置。然而,...

    Android环境变量配置

    在开发Android应用时,正确配置环境变量至关重要,它直接影响到能否顺利运行诸如`adb`(Android Debug Bridge)等开发工具。 #### 步骤一:找到环境变量窗口 首先,确保你已经在Windows系统上成功安装了Android ...

    android-arm上运行的MYSQL

    在Android ARM平台上运行MySQL是一项挑战,因为MySQL主要是为桌面级操作系统设计的,而Android是一个基于Linux内核但针对移动设备优化的操作系统。然而,通过一些技术手段,我们可以在ARM架构的Android设备上安装和...

    Android Studio 3.0 JDK安卓环境配置

    6. 运行和调试应用:使用Android Studio内置的模拟器或连接真实的Android设备进行应用运行和调试。 为了实现更高效的学习和开发,初学者应该熟悉以下知识点和操作: - Android Studio界面概览:了解Android Studio...

    Android最新平台上可运行的Android demo

    在Android开发领域,实践是...通过研究和运行这些示例,开发者可以深入理解Android开发流程,学习如何创建、配置和调试应用,并逐步掌握Android平台上的编程技术。无论是初学者还是经验丰富的开发者,都能从中受益。

    android studio中opencv配置及使用

    ### Android Studio 中 OpenCV 的配置及使用 #### 一、OpenCV简介 OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库。它支持多种编程语言,如 C++ 和 Python,并且提供了跨...

    android项目中读取ini配置文件

    在Android项目中,`assets`文件夹用于存放应用运行时需要的非资源文件,如配置文件、数据库、文本等。要将`ini`文件放入此目录,只需在项目的`src/main/assets`目录下创建一个`ini`文件,例如`config.ini`,并将所...

    导入AndroidStudio无法运行起来的几种解决办法.docx

    要解决安卓源码无法在 Android Studio 中运行的问题,我们需要修改三个关键文件:build.gradle、app 文件夹中的 build.gradle 和 gradle/wrapper/gradle-wrapper.properties 文件。通过这些修改,我们可以让项目正常...

    android 6.0修改静态ip

    6. 应用更改:一旦修改完成,记得保存配置并应用到系统,可能需要重启网络服务或设备。 需要注意的是,上述操作需要在具有系统权限的应用中进行,对于普通应用,除非用户授予了相应的权限,否则无法直接修改静态IP...

    安卓虚拟设备运行helloworld

    安卓虚拟设备可以在 Android Studio 或 Android Eclipse 等集成开发环境中创建和配置。创建虚拟设备需要选择虚拟设备的名称、设备类型、安卓版本和其他配置选项。创建完成后,可以在 Android Studio 或 Android ...

    MTK Android编译环境配置

    MTK Android编译环境配置知识点: 1. 编译环境的硬件要求:编译MTK Android系统需要较高的硬件配置,包括大于2G的内存(推荐8G以获得更好的编译效率),以及32位或64位的CPU。此外,网络连接也是必要的,以便在安装...

    android平台存储容量大小更改

    这个压缩包中的代码可能是实现这一目标的关键步骤,通过这些修改,开发者可以有效地扩展Android设备的存储空间,为用户提供更多的存储容量。在实际应用中,还需要进行详尽的测试以确保所有功能的正常运行。

    Android 模拟器 Genymotion 安装配置与 ARM 支持

    它支持多种设备配置,并且能够模拟最新的Android版本及API级别。对于Android应用开发者而言,Genymotion提供了一个理想的测试环境,可以进行应用程序的功能性测试、性能测试以及UI测试等。 #### 二、Genymotion安装...

    Android手机开发环境配置

    在进入Android手机开发环境配置的过程中,首先需要理解的是Android是一个基于Linux内核的开源操作系统,主要用于移动设备,如智能手机和平板电脑。为了在个人计算机上进行Android应用开发,我们需要搭建一个完整的...

Global site tag (gtag.js) - Google Analytics