带你重新认识Activity的方方面面

来源:互联网 发布:学plc编程 编辑:程序博客网 时间:2024/06/05 21:55

一、Activity的生命周期

   Activity中定义了七个回调方法,覆盖了活动生命周期的每一个环节。

   onCreate():它在活动第一次创建时被调用,在此方法中完成活动的初始化操作,如:加载布局,绑定事件等。

   onStart() :当活动由不可见变为可见时调用。

   onResume():当活动准备好与用户进行交互时调用,此时活动一定位于返回栈的栈顶,并且处于运行状态。

   onPause:在系统去启动或恢复另外一个活动时调用,在此方法中将一些消耗cpu的资源释放掉,并且保存一些关键性数据。

   onStop():当活动变为完全不可见时调用。

   onDestroy():活动销毁之前调用,一些容易导致内存溢出的资源都要在此方法中释放,如:移除消息和回调,解注册Receiver,释放MediaPlayer等。

   onStart():当活动由停止状态变为运行状态时调用,也就是活动被重新启动。

 注意点:

  1、横竖屏切换会重新调用Activity的各个生命周期,默认首先销毁当前Activity然后重新加载。在功能清单文件里添加android:configChanges="orientation|keyboardHidden|screenSize"切屏不会重新调用生命周期的各个方法,只会执行onConfigurationChanged()方法。游戏开发或者全屏播放视频时,朝向都是写死的。

   2、恢复或启动另外一个activity时,如果另一个activity是窗口样式(对话框)将只调用:onPause方法,即当前activity处于可见但不可操作状态。
否则会调用:onPause()-->onStop(),当前activity处于不可见且不可操作的状态。

二、Activity的四大启动模式

  1、standard:默认标准的启动模式,每次startActivity都是创建一个新的Activity实例。适用于绝大多数情况。 2、singleTop:单一顶部,如果要开启的activity已经处于任务栈的栈顶,就不会创建新的实例。 3、singleTask:单一任务栈,Activity在任务栈里只会存在一个实例,如果要激活的activity在任务栈里已经存在, 就不会再创建新的activity,而是复用这个已经存在的activity。    ps:此模式启动activity时会清空任务栈里在这个activity之上的所有activity。 4、singleInstance:单例模式,整个手机操作里只有一个实例存在,不同的应用去打开这个activity,共享同一个activity实例。    ps:它会运行在自己独立的任务栈里,并且任务栈里只有它一个实例存在。  

三、创建一个Activity的步骤


  1、继承于Activity或FragmentActivity,CompatActivity。

  2、在功能清单文件中注册

  3、完成activity对应的布局文件

  4、重写onCreate()并加载布局


四、在Activity的使用过程中,哪些位置用到了反射


 1、在系统创建Activity对象的时候,组件都是系统自动创建的,所以组件都要在功能清单文件中注册并标明全类名。

  2、加载布局文件时,系统通过反射创建指定标签对应的视图对象。

  3、显示意图中:Intent intent = new Intent(Context context,Class clazz);intent携带另外一个Activity 的类型信息,系统根据类型创建另外一个activity的对象。

五、后台Activity被系统回收怎么办,如何保存回收前状态?

 1、原因:除了在栈顶的activity,其他的activity都可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的几率愈大。

  2、解决:可以每隔一段时间保存一次,保存到本地。下次启动时恢复。

  3、回收场景:

    1)资源相关的系统配置发生改变导致Activity被杀死并重新加载,如:横竖屏切换,键盘的显示与隐藏。

    2)内存资源不足时导致低优先级的Activity被杀死

    3)按下Home建

    4)启动另一个activity

  4、onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等。而不应该用来保存持久化数据,持久化数据应该当用户离开当前的 activity时,在 onPause() 中保存(比如将数据保存到数据库或文件中)。说到这里,还要说一点的就是在onPause()中不适合用来保存比较费时的数据,所以这点要理解。


六、其他

 1、Activity的跳转分类:显式跳转,隐式跳转

  2、隐藏标题栏

    1)标题栏:Android4.0加入了Action Bar,但是可能觉得标题栏占用屏幕空间,使得内容区域变小
    2)在setContentView()之前加上:requestWindowFeature(Window.FEATURE_NO_TITLE);

  3、要注意的是:Activity,Service,Application是ContextWrapper的三个子类

  


  


 

1 0
原创粉丝点击