Activity的生命周期

来源:互联网 发布:linux查看mysql连接数 编辑:程序博客网 时间:2024/06/05 04:04

Activity是什么?

  • Activity是Android的四大组件之一
  • 用户可以与其提供的屏幕进行交互
  • 一个Activity可以充满屏幕,也可以悬浮到其他Activity之上!
  • 一个应用通常由多个Activity组成
  • 一个Activity可以打开任何Activity

如何创建一个Activity?

  1. 创建一个类继承Activity或其子类
  2. 重写onCreate()方法
  3. 在onCreate()方法中,添加setContentView方法
    注意:setContentView有三种重载方法,不仅可以直接设置R.layout.xxx布局,也可以直接设置View,动态设置布局,控件在new的时候需要传上下文对象,如this
    TextView tv = new TextView(this);
    setContentView(tv);
  4. 必须在清单文件中声明Activity
    在application标签下添加activity标签,activity标签中必须写的一个属性是android:name,此属性指明要声明activity的类名(写法注意:包名+类名)

Activity的生命周期

  1. Activity的7个生命周期

    • onCreate()
      • Activity创建,通常在此方法内加载布局并初始化资源
    • onStart()

      • 不可见得生命周期,后接生命周期是onResume(),他们是一气呵成的,直接调用!
      • onStart()这个生命周期,控件已经初始化完成(onCreate()已经走完),那么如果,需要绑定控件的操作,需要在此生命周期调用!
    • onResume()

      • 当前Activity即将进入前端!此时的Activity处于多有Activity堆栈的顶端,获取用户焦点!
      • 注: 此时的Activity有着最高的优先级!
      • 此时的生命周期,Activity已经可见!此时可以开启动画等需要可见以后操作的操作!
    • onPause()
      • 此生命周期预示将有另一个Activity将被开启!那么当前Activity需要保留用户需要持久性保存的数据!需要关闭消耗cpu的操作!例如关闭动画!关闭网络链接!关闭数据库链接等!
      • 不能做耗时操作!!
    • onStop()
      • 接onPause()之后调用,此时的优先级已经很弱了,如果系统发生内存不足,那么就会杀死此时的Activity!如果没有被系统杀死,那么重新启动的时候会调用onRestart()!如果被系统杀死了,那么重新启动会调用onCreate()!
      • onStop()和onStart()是对立的,如果onStart()进行了某些事物的绑定,那么可以在onStop()中解除绑定!
    • onRestart()
      • 是当Activity进入onStop()状态,再次启动的时候调用的生命周期!
    • onDestroy()
      • Activity即将被销毁,通常在此方法内销毁资源
    • 三个生命周期
      • 全生命周期:onCreate()到onDestroy()
      • 可视生命周期:onStart()到onStop()之间
      • 前端生命周期:onResume()到onPause()之间

两个Activity页面跳转的生命周期

  • A开启B:
    • A开启:A->onCreate()->onStart()->onResume()->Running
    • A跳转B:A->onPause()->B->onCreate()->onStart()->onResume()->Running->A->onStop()
    • 思考:onPause()为什么不能做耗时操作?
      • 新的页面开启,必须在旧的页面执行onPause()方法之后,如果onPause()方法做了过多的耗时操作,那么会影响新页面的开启,给用户卡顿的效果!!
      • onPause可以保存用户需要的永久性数据,关闭消耗cpu的操作,例如动画或者网络请求,数据库请求等!但是,以上的操作,必须遵循不能大量耗时!如果,有大量的耗时操作必须做!那么可以选择stop生命周期!

现场保护

  • Activity在不做任何保护的时候!切换横竖屏,会销毁再创建!
    • Activity在切换横竖屏的时候,会重新加载生命周期,主要是因为横竖屏可能需要同名但是内容不同的布局!需要重新加载!
    • 横竖屏切换重新执行生命周期,导致一些控件输入的内容不能保存!所以需要手动的保存数据!进行现场保护!
  • 在Android中,EditText、CheckBox如果添加了id会形成自我保护,但仅限于EditText保护文本内容,CheckBox保存勾选状态!
  • 现场保护写法
    1. 第一种方法
      • onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
        Activity自我保护的方法,在发生异常销毁的时候,例如且切换横竖屏,或者内存不足销毁Activity!那么会调用此方法,我们需要做的是,在此方法中保留数据!数据保存到参数的Bundle中即可!
        • Bundle:类似于Map,也是一种键值对形式,它的存储的范围大于Map,可以放序列化对象
      • onRestoreInstanceState(Bundle savedInstanceState)
        当重新加载的时候获取数据
    2. 第二种方法
      • 切换横竖屏不重新走生命周期
      • android:configChanges=”“此标签指定的情况下,不重新走生命周期
        • orientation:屏幕方向改变不重新走生命周期(切换横竖屏)
        • screenSize:屏幕尺寸改变!Android api14以上改变屏幕方向。认为屏幕此寸也跟着改变了!
        • keyboardHidden:软件盘,顶布局,造成生命周期重新加载!加载此限制,不会再重新加载!
    3. 第三种方法
      • 规定横竖屏
        • android:screenOrientation=””
          • landscape:英文单词为风景画(风景画都是横着的),规定横屏
          • portrait:英文单词为肖像(肖像都是竖着的)规定竖屏

Activity跳转传值

  • Intent,意图,它是Android四大组件的纽带!例如:开启Activity、发送广播、开启服务
  • 分类:

    1. 显示意图
      • 知名达意
    2. 隐示意图
  • Intent跳转并传递数据

    • 一、直接放数据传递
      • 利用Intent
        • Extra属性,intent.putExtra(key,values)
        • 注意:不能直接放置对象,应把对象序列化后再放进去
        • 让类实现Serializable接口,应在类中指定serialVersionUID,防止在读取对象的时候,因为类的改变,而造成无法读取的问题
      • 取值
        • 获取Intent(),获取传递过来的意图,注意:此意图可能来自不同的Acitivity,当获取数据的时候,需要进行非空判断!
        • 获取Intent中的数据,intent.get对应类型Extra(key)
    • 二、封装Bundle进行传值
      • 创建一个Intent,intent.putExtras(Bundle),可以把数据放到Bundle
      • getIntent(),Bundle bundle=intent.getExtras()
      • Bundle中取值即可,bundle.get类型Extra(key)
      • 直接传值putExtra和封装Bundle进行传值putExtras
        • 相同点:
          • 都把数据放到Intent
          • 他们传值的类型相同
        • 不同点:
          • putExtra直接把数据放到Intent上
          • putExtras先封装Bundle,把Bundle放到Intent上
            Android系统中,常用的是封装Bundle!
    • 三、借助于Application进行传值
      • 创建一个类继承Application
      • 在清单文件中,application标签下生命android:name=”类名“
      • Application可以重写onCreate()生命周期
        Application的onCreate()优先于Activity的onCreate(),可以在Application的onCreate()中进行全局的初始化工作!
      • 在本程序的任何类中,可以调用getApplication(),来获取Application类的对象!

跳转页面并获得返回值

  • 当前页面启动Activity,startActivityForResult(Intent,RequestCode);
  • setResult(int ResultCode,Intent);
  • 当前Activity,onActivityForResult();
  • 注意:finish()方法,结束当前Activity
0 0
原创粉丝点击