zoukankan      html  css  js  c++  java
  • Android中activity的生命周期

    1.通常activity可能的三种基本状态

    • Resumed(运行状态)
      activity在屏幕的前台并且拥有用户的焦点(或者称为running状态)。

    • Paused(挂起状态)
      另一个activity在前台并且拥有焦点,但是本activity还是可见的。也就是说这个activity是可见进程。一个Paused的activity是完全存活的(Activity对象仍然保留在内存里,它保持着所有的状态和成员信息,并且保持与window manager的连接),但是在系统内存严重不足的情况下它能被杀死。

    • Stooped(停止状态)
      本activity被其他的activity完全遮挡,成为一个后台进程。一个stooped的activity也仍然是存活的(Activity对象仍然在内存中,它保持着所有的状态和成员信息,但是不再与window manager联接了)。但是,对于用户而言他已经不在可见了,并且当其他地方需要内存时它将会被杀死。
      如果activity被paused或者stopped了,则系统可以从内存中删除它,通过请求finish(调用它的finish()方法)或者直接杀死它的进程。当这个activity再次被启动的时候(在被finish或者kill之后),它必须完全重建。

    2.实现生命周期的回调方法

    当一个activity在上述描述的状态之间转换的时候,它将通过各种回调方法来获得通知。所有的回调方法都是钩子(hook),当activity状态发生改变时你可以重写这些方法来执行对应的工作。
    以下包含了所有的基本生命周期方法:

    public class ExampleActivity extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // The activity is being created.
        }
        @Override
        protected void onStart() {
            super.onStart();
            // The activity is about to become visible.
        }
        @Override
        protected void onResume() {
            super.onResume();
            // The activity has become visible (it is now "resumed").
        }
        @Override
        protected void onPause() {
            super.onPause();
            // Another activity is taking focus (this activity is about to be "paused").
        }
        @Override
        protected void onStop() {
            super.onStop();
            // The activity is no longer visible (it is now "stopped")
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // The activity is about to be destroyed.
        }
    }
    
    • activity的完整生命周期会在onCreate()调用和onDestroy()调用之间发生。你的activity应该在onCreate() 方法里完成所有“全局global”状态的设置(比如定义layout), 而在onDestroy() 方法里释放所有占用的资源。 例如,如果你的activity有一个后台运行的线程,用于从网络下载数据,那么你应该在 onCreate() 方法里创建这个线程并且在 onDestroy() 方法里停止这个线程。

    • activity的可见生存期会在 onStart() 调用和 onStop() 调用之间发生。在这期间,用户可在屏幕上看见这个activity并可与之交互。 例如,当一个新的activity启动后调用了 onStop() 方法,则这个activity就无法被看见了。 在这两个方法之间,你可以管理那些显示activity所需的资源。例如,你可以在 onStart() 方法里注册一个 BroadcastReceiver 用于监控影响用户界面的改动。并且当用户不再看到你的显示内容时,在 onStop() 方法里注销掉它。 系统会在activity的整个生存期内多次调用 onStart() 和onStop(), 因为activity可能会在显示和隐藏之间不断地来回切换。

    • activity的前台生存期会在 onResume() 调用和 onPause() 之间发生。在这期间,activity是位于屏幕上所有其它的activity之前,并且拥有用户的输入焦点。 activity可以频繁地进入和退出前台——例如, 当设备进入休眠时或者弹出一个对话框时, onPause() 就会被调用。因为这个状态可能会经常发生转换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该相当地轻量化。

    • 同样下图是生命周期的回调方法

    回调方法

    3.保存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第一次被创建时就是如此)。

    注意: activity被销毁之前,并不能确保每次都会调用 onSaveInstanceState() ,因为存在那些不必保存状态的情况(比如用户使用BACK键离开了你的activity,因为用户明显是关了这个activity)。 如果系统要调用 onSaveInstanceState() 方法,那么它通常会在 onStop() 方法之前并且可能是在 onPause() 之前调用。

    原文链接:https://www.jianshu.com/p/c1d8f5504d80

  • 相关阅读:
    配置Echarts大全
    MAthJax入门教程(五分钟上手)
    JQ常用方法(哈哈)
    神奇的数组去重。
    echarts零基础快速入门
    css3 媒体查询的学习。
    css样式 body的font-size 为什么用625%
    移动端横向滚动条。
    剧中自适应问题
    iPhone 横屏时默认会放大文字的问题
  • 原文地址:https://www.cnblogs.com/charlottepl/p/12545293.html
Copyright © 2011-2022 走看看