精华内容
下载资源
问答
  • 旋转屏幕Activity执行的生命周期方法

    千次阅读 2016-12-17 19:26:11
    很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态,那么在旋转屏幕的时候都会调用activity生命周期的哪些方法呢,今天写了个程序运行得出了如下结果: ...

    个人学习笔记:

    很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态,那么在旋转屏幕的时候都会调用activity生命周期的哪些方法呢,今天写了个程序运行得出了如下结果:

    (1)如果销毁当前的Activity,那么就要重写Activity的两个方法

    onSaveInstanceState()保存数据和 onRestoreInstanceState()还原数据
    执行顺序:
    onCreate
    onStart
    onResume


    onPause
    onSaveInstanceState
    onStop
    onDestroy
    onCreate
    onStart
    onRestoreInstanceState
    onResume


    在灭屏时调用的方法
    onPause
    onSaveInstanceState
    onStop


    屏幕重新唤醒时调用的方法:
    onRestart
    onStart
    onResume


    退出程序时调用的方法:
    onPause
    onStop
    onDestroy


    (2)在manifest.xml文件中设置android:configChanges="orientation|keyboardHidden|screenSize"
    切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
    需注意的是,在4.0以后的版本需要加上ScreenSize 不然不会执行onConfigurationChanged方法
    执行顺序:
    onCreate
    onStart
    onResume


    onConfigurationChanged
    展开全文
  • Android开发文档上专门有一小节解释这个问题。简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对... 当屏幕旋转时,这个Configuration就发生了改变,因此当前显示的Activi
  • 横竖屏切换时候activity的生命周期: 1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次  2、设置Activity的android:configChanges=...

    横竖屏切换时候activity的生命周期:

    1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 
    
      2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 
    
      3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

    1.当前的Activity不销毁:

    那么就需要在AndroidManifest.xml配置文件中的Activity标签下面添加:android:configChanges="orientation|keyboardHidden"

    然后在activity中重写onConfigurationChanged()方法,每次旋转时会调用该方法,可以再该方法中处理数据。

    2.销毁当前的Activity:

    如果销毁当前的Activity,那么就要重写Activity的两个方法onSaveInstanceState()和 onRestoreInstanceState(),显然从方法名字可以看出一个是保存

    注意:不同的手机Activity可能对应的生命周期不一样,在不同生命周期中进行不同的逻辑操作。有些手机小米只会从onResume()的生命周期开始,有的手机三星会从onCreate()开始。

    三星手机横竖屏切换,可以使用一个中间的Activity进行过渡,专门去跳转摄像头。





    展开全文
  • 简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对Activity的界面造成影响,这时系统会销毁并重建Activity以便反映新的Configuration。“屏幕方向”(orientation)是...

     

    Android开发文档上专门有一小节解释这个问题。简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对Activity的界面造成影响,这时系统会销毁并重建Activity以便反映新的Configuration。 
    “屏幕方向”(orientation)是一个Configuration,通过查看Configuration类的javadoc可以看到其他Configuration还有哪些:如fontScale、keyboardHidden和locale等等。 
    当屏幕旋转时,这个Configuration就发生了改变,因此当前显示的Activity需要被重建,Activity对象会被终止,它的onPause()、onStop()和onDestroy()方法依次触发,然后一个新的Activity对象被创建,onCreate()方法被触发。假设屏幕旋转前,用户正在手机上填写一个注册表单,如果处理不当,用户会发现旋转后的表单变成空白的了,严重影响使用体验。 
    要解决这个问题有三种方法: 
    方法1:禁止旋转屏幕 
    毫无疑问,这是最懒的办法了,相当于回避了本文提出的问题,方法如下看看就好: 
    复制代码 代码如下:

    <activity android:name=".MyActivity" 
    android:screenOrientation="portrait" 
    android:label="@string/app_name"> 

     


    方法2:旋转后恢复现场 
    既然Activity会被销毁,那么我们就可以使用前文介绍过的“持久化/恢复现场”方法来解决。即在onPause()里将用户当前已经输入的内容保存到数据库或Preference,在onCreate()方法里读取并填充到表单中,这也是官方推荐的方法。 
    需要补充一点,如果Activity重建需要耗费大量资源或需要访问网络导致时间很长,可以实现onRetainNonConfigurationInstance()方法将所需数据先保存到一个对象里,像下面这样: 
    代码如下:

    @Override 
    public Object onRetainNonConfigurationInstance() { 
    final MyDataObject data = collectMyLoadedData(); 
    return data; 
    } 

     


    重建时,在onCreate()方法里通过getLastNonConfigurationInstance()方法获得之前保存的数据,如下所示: 
    代码如下:

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance(); 
    if (data == null) {//表示不是由于Configuration改变触发的onCreate() 
    data = loadMyData(); 
    } 
    ... 
    } 

     


    方法3:手工处理旋转 
    一般情况下Configuration的改变会导致Activity被销毁重建,但也有办法让指定的Configuration改变时不重建Activity,方法是在AndroidManifest.xml里通过android:configChanges属性指定需要忽略的Configuration名字,例如下面这样: 
    代码如下:
    <activity android:name=".MyActivity" 
    android:configChanges="orientation|keyboardHidden" 
    android:label="@string/app_name"> 

     




    这样设置以后,当屏幕旋转时Activity对象不会被销毁——作为替代,Activity的onConfigurationChanged()方法被触发,在这里开发者可以获取到当前的屏幕方向以便做必要的更新。既然这种情况下的Activity不会被销毁,旋转后Activity里正显示的信息(例如文本框中的文字)也就不会丢失了。 
    假如你的应用里,横屏和竖屏使用同一个layout资源文件,onConfigurationChanged()里甚至可以什么都不做。但如果横屏与竖屏使用不同的layout资源文件,例如横屏用res/layout-land/main.xml,竖屏用res/layout-port/main.xml,则必须在onConfigurationChanged()里重新调用setContentView()方法以便新的layout能够生效,这时虽然Activity对象没有销毁,但界面上的各种控件都被销毁重建了,你需要写额外的代码来恢复界面信息。 
    代码如下:

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "横屏模式", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "竖屏模式", Toast.LENGTH_SHORT).show(); 
    } 
    } 

     


    官方的Android开发文档不建议使用这种方式处理Configuration改变: 
    Note: Using this attribute should be avoided and used only as a last-resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change. 
    最佳实践 
    考虑到旋转屏幕并不是使Activity被销毁重建的唯一因素,仍然推荐前文介绍过的方法:在onPause()里持久化Activity状态,在onCreate()里恢复现场,可以做到一举多得;虽然Google不推荐设置android:configChanges属性的方式,但如果你的Activity横向纵向共用同一个layout文件,方法3无疑是最省事的。

    来源于脚本之家:http://www.jb51.net/article/31833.htm

    转载于:https://www.cnblogs.com/ithaibo-sit/p/4527032.html

    展开全文
  • activity在竖屏的时候,顶部会有状态栏,顶部会有ToolBar,现在需求是,旋转屏幕以后,横屏状态下 整个界面是以全屏状态显示,隐藏ToolBar,不显示屏幕最顶部的状态栏首先,在AndroidManiFest里面设置Activity的属性...

    activity在竖屏的时候,顶部会有状态栏,顶部会有ToolBar,现在需求是,旋转屏幕以后,横屏状态下 整个界面是以全屏状态显示,隐藏ToolBar,不显示屏幕最顶部的状态栏

    首先,在AndroidManiFest里面设置Activity的属性:

               
    <activity
        android:name=".MainActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:screenOrientation="sensor"
        />

    然后,在Activity中重写onConfigurationChanged方法,代码如下:

    private boolean portrait;
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        portrait = newConfig.orientation == Configuration.ORIENTATION_PORTRAIT;
        tryFullScreen(!portrait);
    }
    
    private void tryFullScreen(boolean fullScreen) {
        if (activity instanceof AppCompatActivity) {
            ActionBar supportActionBar = ((AppCompatActivity) activity).getSupportActionBar();
            if (supportActionBar != null) {
                if (fullScreen) {
                    supportActionBar.hide();
                } else {
                    supportActionBar.show();
                }
            }
        }
        setFullScreen(fullScreen);
    }
    
    
    private void setFullScreen(boolean fullScreen) {
            WindowManager.LayoutParams attrs = getWindow().getAttributes();
            if (fullScreen) {
                attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
                getWindow().setAttributes(attrs);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            } else {
                attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
                getWindow().setAttributes(attrs);
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            }
    
    }
    这样就能实现自动旋转屏幕,并且全屏的需求了
    展开全文
  • 简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configuration)的改变都可能对Activity的界面造成影响,这时系统会销毁并重建Activity以便反映新的Configuration。  “屏幕...
  • 主要针对屏幕旋转Activity 生命周期有何影响。 第一种情况 在没有其它配置的情况下,通过日志打印屏幕旋转会调用的方法。 //onPause()----onStop()-----onDestroy()-----onCreate() ---- onStart()---onResume()...
  • 1、防止屏幕旋转Activity 重启,配置文件加上声明,大于API 13 2、`android:configChanges="orientation|screenSize"` 3、加上后,Activity没有重建,也没有调用 onSaveInstanceState 和 onRestoreInstanceState ...
  • 当手机转屏时,Activity的onDestroy和onCreate方法会被调用 为了避免Activity在转屏时销毁: 1)修改AndroidManifest.xml 在activity属性中加入:  android:launchMode="singleTask" android:...
  • 当我旋转屏幕时, onCreate方法重启程序,重新创建所有的元素。所以在manifest文件中设置 android:configChanges="orientation" 再次旋转屏幕时,onCreate方法不被调用了,但是新布局显示的也不正确。 在...
  • 旋转屏幕会改变设备配置,设备配置就是用来描述当前状态的一系列特征。这些特征包括:屏幕的方向、屏幕的密度、屏幕的尺寸、键盘类型、底座模式及语言等等。屏幕的旋转同时会影响着Activity的生命周期。‘  下面...
  • 屏幕旋转activity的生命周期如下 执行onPause方法后执行onSaveInstanceState,我们可以在这个方法执行时保存数据在Bundle中。当再次执行oncreate时把数据拿出来,也可以 在onRestoreInstanceState中拿到数据。 ...
  • android屏幕旋转时默认会重新加载页面,用户体验较差。 如果要禁止重新加载可以用如下方法: AndroidManifest.xml中对应的activity下增加一项 android:configChanges="orientation|screenSize" &...
  • 屏幕界面旋转(可能是用户手动旋转的),【注意:如果你的开发 API 等级等于或高于 13 ,你还需要设置 screenSize ,因为 screenSize 会在屏幕旋转时改变】 keyboardHidden ,键盘辅助功能改变 如下: ...
  • 当设备旋转时,系统会默认销毁当前activity实例,然后再...设备一经旋转,Android需要销毁当前activity,然后新建一个activity来完成oncreate()方法的调用,从而实现使用最佳资源匹配新的设备配置。 要解决这个问题
  • 在应用中想要固定屏幕的方向有两种方法 1、在AndroidManifest.xml的activity中加入: android:screenOrientation=”landscape” 属性即可(landscape是横向,portrait是纵向)。 2、随屏幕旋转时,不重新调用onCreate。
  • 很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态,个人认为有两个方法提供使用: 1.当前的Activity不销毁: 那么就需要在AndroidManifest.xml配置文件...
  • 屏幕旋转Activity会重新创建 可以调用onSaveInstanceState方法进行保存一些信息,在onRestoreInstanceState方法中得到上次保存的信息。 今天要说的是onRetainCustomNonConfigurationInstance和...
  • Android屏幕旋转Activity的生命周期

    千次阅读 2014-09-24 22:19:00
    很多时候会用到屏幕旋转时需要对一些数据进行保存,例如当横竖屏区切换时要保存先前屏幕的一些数据和状态,个人认为有两个方法提供使用: 1.当前的Activity不销毁: 那么就需要在AndroidManifest.xml配置文件...
  • android屏幕旋转时,Activity不重新调用onCreate的方法  参考:http://jy0329.blog.163.com/blog/static/1474660022013028102228579/
  • 最近学习了Android开发的相关课程,也试着动手做了书上的例子和自己的... 教材中提到的解决方法是分别创建水平和垂直布局,再通过覆盖onSaveInstanceState(Bundle)方法保存数据,在屏幕旋转后将数据传递给新的Activ...
  • 关于onConfigurationChanged这个方法是当系统配置信息改变时默认就会执行,如语言、屏幕旋转。 在屏幕旋转时跟踪到Activity以及它绑定的Fragment的以下log: 问题来了红框中为何Fragment的onAttach和onCreate执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 399
精华内容 159
关键字:

旋转屏幕activity方法