博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

关于Activity需要知道事

Posted on 2017-03-06 15:24  Jasonhy  阅读(149)  评论(0)    收藏  举报

     对于activity来说,我们再熟悉不过,每一个app打交道最多的就是activity了,这也证明了它的重要性,接下来我们只讲几个点:

       第一:创建到销毁生命周期的调用,以及我们在对应的生命周期需要做的事

    第二:清单文件的配置,涉及一些主题的配置,输入法遮盖问题等 

  现在来看第一个问题,生命周期。我们知道onCreate是进行以初始化工作的,比如xml文件的加载,进行网络请求的时候获取数据操作,还有一些注册监听等,当一个Activity被启动之后,ActivityManager就会产生一个新的线程,这个线程我们成为主线程,也就做UI线程--ActivityThread,我们换一个角度来思考,既然启动了一个Activity就会创建一个UI线程,那也就是说Activity的生命周期中都是在UI线程执行的,onCreate做一些初始化工作,比如说获取网络数据,就要开启线程了,延伸来说,如果想要在对应的生命周期里面执行一些耗时操作的话,那都是要开启线程,避免UI线程被阻塞。onStart表示Activity正在被启动,这是的Activity处于可见状态,但是由于这个阶段Activity还没有来到前台,所以也没办法进行交互,我们可以理解成一辆火车,远远的就听到了火车的声音,但是我们还没有看到火车;onResume这时候的Activity已经出现在前台了,我们也可以进行相应的交互操作,比如我们可以进行刷新操作,假设我们有楼层这么一个列表,然后可以对其进行评论,当我们评论完成返回的时候,楼层就多了一层,如果在这里进行一定的刷新操作的话,就可以获取得到最新的数据了;onPause我们刚才说,点击评论进入一个评论的界面,那么楼层的这个界面将会调用这个方法来表示正要停止,对一些必要的数据,可以在这里进行存储,这里有一个问题,假设要将数据保存的本地,也就是进行IO操作,比如数据量比较大,需要执行两秒,才能写完,然后发现当点击跳转的时候,页面一直停留在当前的界面,一直等到两秒结束之后才能跳转,这就说明了,虽然让你在这里保存数据,但是保存的数据必须是轻量级的;onStop一般情况,当onPause被执行的时候,紧接着这个方法就会被执行,除非我们一跳转,然后快速的按返回键,这个方法表示Activity即将停止,在这里也可以进行一些轻量级的回收工作;onRestart表示当上一个界面的onStop被调用之后,当前页面返回到上一个页面的时候,或者按下home键退回到桌面,就会被执行;onDestory表示Activity即将被销毁,在这里主要是做一些资源释放操作,下面是以上操作过程的Log输出:

//Activity刚启动的时候
03-06 14:58:58.580 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onCreate  ----
03-06 14:58:58.590 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onStart  ----
03-06 14:58:58.590 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onResume  ----

//页面跳转的时候
03-06 14:58:58.580 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onCreate  ----
03-06 14:58:58.590 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onStart  ----
03-06 14:58:58.590 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onResume  ----
03-06 15:01:36.910 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onPause  ----
03-06 15:01:36.950 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onCreate  ----
03-06 15:01:36.950 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onStart  ----
03-06 15:01:36.950 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onResume  ----
03-06 15:01:37.290 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onStop  ----

//返回键回退的时候
03-06 14:58:58.580 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onCreate  ----
03-06 14:58:58.590 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onStart  ----
03-06 14:58:58.590 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onResume  ----
03-06 15:01:36.910 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onPause  ----
03-06 15:01:36.950 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onCreate  ----
03-06 15:01:36.950 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onStart  ----
03-06 15:01:36.950 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onResume  ----
03-06 15:01:37.290 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onStop  ----
03-06 15:03:12.670 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onPause  ----
03-06 15:03:12.680 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onRestart  ----
03-06 15:03:12.680 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onStart  ----
03-06 15:03:12.680 28150-28150/com.jasonhy.activitydemo E/MainActivity: ----  onResume  ----
03-06 15:03:13.010 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onStop  ----
03-06 15:03:13.010 28150-28150/com.jasonhy.activitydemo E/FirstActivity: ----  onDestroy  ----
生命周期

   在前面说到当进行页面跳转的时候,需要对必要的数据进行保存,查看源码的时候,发现有onSaveInstanceState这个方法,也是用来保存数据的,官方介绍是,当Activity异常终止的时候,系统就会调用onSavaInstanceState方法来保存数据,调用时机是在onStop之前,和onPause没有之间的调用顺序没有必然的联系,然后当Activity被重新创建的时候,系统会调用onRestoreInstanceState,并且把onSavaInstanceState所存的Bundle对象作为参数传给onRestoreInstanceState和onCreate方法,从调用顺序来看,onRestoreInstanceState是在onStart之后调用,还有一种就是内存不足,Activity被意外杀死,执行过程和屏幕旋转差不多。如:

03-06 15:51:11.060 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onCreate  ----
03-06 15:51:11.060 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onStart  ----
03-06 15:51:11.060 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onResume  ----
03-06 15:51:22.490 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onPause  ----
03-06 15:51:22.490 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onSaveInstanceState  ----
03-06 15:51:22.490 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onStop  ----
03-06 15:51:22.490 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onDestroy  ----
03-06 15:51:22.540 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onCreate  ----
03-06 15:51:22.550 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onStart  ----
03-06 15:51:22.550 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onRestoreInstanceState  ----
03-06 15:51:22.550 1656-1656/com.jasonhy.activitydemo E/MainActivity: ----  onResume  ----
屏幕旋转生命周期调用

 

   第二题,清单文件的相关配置,我们只看一个问题就是输入法的遮盖问题。我们要引入一个DialogFragment,当我们点击评论的时候,通过它来弹出评论对话框,目前大部分的弹出框基本都是这个类,因为它有着Fragment基本一直的生命周期,而且还可以内嵌Dialog,在管理上有大的优势,比如在屏幕旋转和按下后退键的时候,我们都可以对其生命周期进行一定的操作,至少需要实现onCreateView或者onCreateDialog方法,onCreateView是用来定义xml布局文件来展示Dialog的,而onCreateDialog即利用AlertDialog或者Dialog来创建Dialog,如果我们想去掉对话框的标题的话,可以在onCreateView中社设置getDialog().requestWindowFeatrue(Window.FEATURE_NO_TITLE)。避免遮盖,可以在清单文件配置,android:windowSoftInputMode="stateVisible|adjustPan"