zoukankan      html  css  js  c++  java
  • Activity生命周期

    1.Activity 是这样一个程序组件,它为用户提供一个用于任务交互的画面。例如,拨打电话,拍照,发邮件。或者查看地图。每一个activity都被分配一个窗口。在这个窗口里,你可以绘制用户交互的内容。 这个窗口通常占满屏幕,但也有可能比屏幕小,并且浮在其它窗口的上面

    2.创建一个Activity就会在内存创建一个Activity的对象,那么它有生存期,也称为生命周期。android是通过实现回调方法来管理activity的生命周期的。

    3.三种基本状态:

    Resumed----activity在屏幕的前台并且拥有用户的焦点。(这个状态有时也被叫做“running”。)

    Paused--------另一个activity在前台并拥有焦点,但是本activity还是可见的。 也就是说,另外一个activity覆盖在本activity的上面,并且那个activity是部分透明的或没有覆盖整个屏幕。 一个paused的activity是完全存活的(Activity 对象仍然保留在内存里,它保持着所有的状态和成员信息,并且保持与window manager的联接),但在系统内存严重不足的情况下它能被杀死。

    Stopped---------本activity被其它的activity完全遮挡住了(本activity目前在后台)。 一个stopped的activity也仍然是存活的(Activity 对象仍然保留在内存中,它保持着所有的状态和成员信息,但是不再与window manager联接了)。 但是,对于用户而言它已经不再可见了,并且当其它地方需要内存时它将会被杀死。

    4.七个生命周期回调方法

    public class MainActivity extends Activity {
    
        String tag = "MainActivity";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Log.e(tag,"onCreate");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.e(tag,"onDestroy");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.e(tag,"onResume");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.e(tag,"onPause");
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.e(tag,"onStart");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.e(tag,"onStop");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.e(tag,"onRestart");
        }
    }

    5.启动后打印结果,可见启动一个Activity走这么个顺序:onCreate--》 onStart---》 onResume,Activity的界面可见,可以触摸

    6.按了Home键后,走这么个顺序onPause--> onStop,Activity界面不可见,不可以获取焦点

    7.重新点击应用后走这么个顺序onRestart---> onStart--->onResume

    8.按回退按钮走这么个顺序onPause-->onStop-->onDestory不可见,应用退出

    9.再次重新点击这个应用,可以看见走了onCreate方法

    10.综上所述,只有onDestory方法调用了才表示Activity销毁了,其他方法调用只是Activity的状态改变了。

    当一个activity被paused或者stopped时,activity的状态可以被保存。 的确如此,因为 Activity 对象在paused或者stopped时仍然被保留在内存之中——它所有的成员信息和当前状态都仍然存活。 这样用户在activity里所作的改动全都还保存着,所以当activity返回到前台时(当它“resume“),那些改动仍然有效。

    不过,如果系统是为了回收内存而销毁activity,则这个 Activity 对象就会被销毁,这样系统就无法简单地resume一下就能还原完整状态的activity。 如果用户要返回到这个activity的话,系统必须重新创建这个Activity 对象。可是用户并不知道系统是先销毁activity再重新创建了它的,所以,他很可能希望activity完全保持原样。 这种情况下,你可以保证activity状态的相关重要信息都由另一个回调方法保存下来了,此方法让你能保存activity状态的相关信息: onSaveInstanceState()。

    在activity变得很容易被销毁之前,系统会调用 onSaveInstanceState()方法。 调用时系统会传入一个Bundle对象, 你可以利用 putString() 之类的方法,以键值对的方式来把activity状态信息保存到该Bundle对象中。 然后,如果系统杀掉了你的application进程并且用户又返回到你的activity,系统就会重建activity并将这个 Bundle 传入onCreate() 和onRestoreInstanceState() 中,你就可以从 Bundle 中解析出已保存信息并恢复activity状态。如果没有储存状态信息,那么传入的 Bundle 将为null(当activity第一次被创建时就是如此)

    因为 onSaveInstanceState() 并不保证每次都会被调用,所以你应该只用它来记录activity的一些临时状态信息(UI的状态)——千万不要用它来保存那些需要长久保存的数据。 替代方案是,你应该在用户离开activity的时候利用 onPause() 来保存永久性数据(比如那些需要存入数据库里的数据)。

    一个检测应用程序状态恢复能力的好方法就是旋转设备,使得屏幕方向发生改变。 当屏幕的方向改变时,因为要换用符合实际屏幕参数的资源,系统会销毁并重建这个activity。 正因如此,你的activity能够在被重建时完整地恢复状态是非常重要的,因为用户会在使用应用程序时会频繁地旋转屏幕

    贴出生命周期图

    需要程序源码的可以加我微信x241602私聊。
  • 相关阅读:
    vue-router总结2
    vue-router总结
    react中的路由模块化
    react路由嵌套
    Javascript设计模式之我见:迭代器模式
    Javascript设计模式之我见:观察者模式
    【C语言】格式符
    【编译原理】代码在编译器中的完整处理过程
    【数据库】增删改查操作
    测试
  • 原文地址:https://www.cnblogs.com/huipengbo/p/7118793.html
Copyright © 2011-2022 走看看