Android开发的经验已经有两年多了,最近想总结一下自己学到的知识。首先想到的就是Android入门就会听到的四大组件(Activity, Service, Content Provider, BroadCast Receiver),接着后面还会介绍AS使用的相关经验,UI界面各个组件的使用详解等... ...大体的计划就是这样,下面就来介绍今天要介绍的Activity。
在Android开发中打交道最多的莫过于Activity(或者有些项目用得比较多的Fragment),Activity方面的知识有很多,我就从下面几个方面来简单介绍一下Activity吧。
1.Activity的生命周期
2.Activity的启动方式
3.Activity一些细节的知识点
1.Activity的生命周期
在每次要写界面的时候都会在重写Activity 的onCreate方法,然后在里面调用setContentView来绑定Activity.java文件跟layout.xml文件之间的关系(有些人或许会说不用重写onCreate,直接继承一些已经写好的BaseActivity之类的就好了,这些其实根本上都是要重写onCreate的,这是在应用搭建的时候进行了相应的封装形成了一个框架,方便以后的开发跟修改),多说无益,先上图(图片来源不清楚了),然后再进行一一介绍。
从图片中就可以很清楚地看出,一个Activity的开始是从onCreate开始的,然后调用onStart-> onResume, 通过这三个回调,一个Activity就会显示在屏幕上
在onResume之后,此时如果Activity之上打开了一个Dialog之类的导致Activity部分被隐藏,Activity就会进入onPause回调。如果Dialog消失Activity又完全可见的话,Activity就会 进入onResume回调,然后Activity就又在Running了。如果在onPause的时候Activity变为完全不可见,那么Activity就会调用onStop,这个时候Activity有可能因为系统回收进入onDestroy也有可能重新变为可见(这样就会进入onRestart -> onStart -> onResume).
在onPause跟onStop状态下的Activity可能因为系统需要内存而被强行回收(不会执行任何回调)。
在onDestroy之后,如果Activity要重新显示的话就又要重新从onCreate开始了。
小结一下Activity的生命周期:在Android的开发中,对Activity的生命周期的掌握是非常非常重要!!!熟练掌握Activity的生命周期,可以避免一堆问题,也可以清楚地知道什么时候该执行什么样的操作。这里要注意一个点就是onStop跟onDestroy在内存紧张的时候是不一定会被执行的,所以如果有一些必须在Activity结束的时候释放的东西千万不要在这里释放。
2.Activity的启动模式
Activity的启动模式有四种(Standard, SingleTask, SingleTop, SingleInstance),在介绍启动模式之前有必要介绍一下Activity栈的相关知识(系统会维护一个Activity栈,每打开一个Activity系统都会对Activity栈进行管理),下面就一个一个的来介绍,Standard是默认的启动模式,启动模式可以在manifest文件中的Activity标签中对launchMode进行设置。
Standard
启动 Activity 时在原来的 Activity 栈的栈顶增加一个 Activity ,不管原来 Activity 是否在栈中存在(所以你重复启动一个Activity,你按返回的话返回的还是你启动的Activity)。
SingleTask
在一个 Activity 栈中只保存一个实例,启动 Activity 时会直接将在 Activity 栈中的存在的实例放到栈顶(这过程中在这个实例上面的 Activity 全部出栈,比如先启动了 SingleTaskActivity ,然后启动 OneActivity ,再启动 TwoActivity ,再启动 SingleTaskActivity 的时候 OneActivity 跟 TwoActivity 都会先出栈),如果启动 Activity 不存在栈中就直接启动。
SingleInstance
直接在一个新的 Activity 栈中新建一个实例,当再次启动时不再新建实例。如果使用ApplicationContext启动Activity的话就必须设置被启动Activity的启动模式为SingleInstance。
SingleTop
当启动的 Activity 在栈顶时不新建Activity添加到栈中,当启动Activity不在栈中或者不在栈顶启动模式跟Standard一样。
启动模式小结:不同的启动模式会导致系统在管理Activity栈的时候采取不同的操作,要深入理解这四种不同的模式,然后才能全面理解Activity的跳转之类的知识,才不会出现一些莫名其妙的问题,就算出线问题也懂得分析究竟是哪里出了问题。
需要注意的有一点是:被启动用来获取数据的Activity(也就是startActivityForResult启动的Activity)不能是SingleTask。这点只要你分析一下SingleTask的启动特点你就会了解为什么不能这样了,如果是可以的话就有可能会出现这样的问题(假设B是SingleTask启动模式的Activity,首先先正常启动B Activity,然后启动A Activity,然后A Activity通过startActivityForResult的方式启动B Activity,此时根据SingleTask的特性就会把A Activity先弹出Activity栈,然后B Activity返回数据的时候A Activity就已经不在了,所以说被启动用来获取数据的Activity不能是SingleTask)。
3.Activity细节知识点
1. A启动B时会依次执行A的onPause然后是B的onCreate --> onStart --> onResume,最后才是A的onStop,所以希望在B中从数据库读到A中储存的最新数据,就务必在A的onPause中储存数据到数据库而不是在onStop中储存。
2.在onPause中提交修改的数据(特别是Content Provider中的数据),在onCreate中做初始化操作
总结(直接看图,如果有需要的话可以跟我拿iThoughtsX的源文件):
关于LaunchMode也简单写了个demo,操作这个demo可以加深对其理解,下面是demo截屏(demo Android Studio源码可以进入我的主页去资源那里下载Android Studio源代码 )