论Activity及启动模式,Fragment,Service的使用以及生命周期

时间:2023-03-08 15:35:46
论Activity及启动模式,Fragment,Service的使用以及生命周期

Activity:

这是我总结出来的,介于Activity生命周期相对较多,我在Google官方的生命周期图上又加了几个常用的,便于大家理解

对于ACtivity,先说说启动模式(ps:复制党去死吧,这年头加一点自己的特色好吗):

1,默认模式,启动Activity的时候新建一个实例,然后推入栈中,生命周期从onCreate()开始(这是必须的)

2,singletop,顾名思义嘛,当Activity的实例在栈顶的时候,如果还要启动它,走onNewIntent(),应用实例:三条推送,点进去都是一个activity,这肯定用singletop啊.

3, singletask,启动它,都走onNewIntent(),然后把栈中位置在activity上面的Activity统统destroy,通常应用于首页,首页肯定得在栈底部,也只能在栈底部。

4,singleinstance,启动它,都走onNewIntent(),并且在一个新的栈里面,通常用于与程序分离的页面,比如说一个新闻程序,然后一个闹钟activity,肯定是singintance

论Activity及启动模式,Fragment,Service的使用以及生命周期

这张图说一个稍微注意的地方,onsaveInstanceState(Bunble bundle)通常和onRestoreInstanceState(Bunble bundle)不会成对出现,onRestoreInstanceState这玩意儿不太好触发,给大家提个好办法,横竖屏切换的时候100%会触发。然后保存在onRestoreInstanceState()bundle里面的数据,就是onCreate的那个参数bundle啦,要怎么恢复就看开发者了。

/** 这几天项目上线,太累,基本没写博客了,说好的Fragment,现在开始*/

Fragment:

这玩意儿该怎么说呢。。。先贴一张生命周期图吧,图是Android官网最新的图,我自己加了一个挺有用的生命周期方法 (ps:再次鄙视写博客到处抄的人)

论Activity及启动模式,Fragment,Service的使用以及生命周期

历史:先说说Fragment的来源吧(百度大部分的说法根本不要信,简直蛋疼,抄来抄去,都是错的),Android诞生之初是不支持触屏的,大家都知道,诺基亚的手机大家用过吧,一点点屏幕,Android刚开始也类似,小屏幕,一个屏幕View很少,Acvitity管理View就够了。但是,ios出来之后,Android改变了目标,Fragment就是赤裸裸的抄袭。。。做过ios开发的人都知道,一个VC可以嵌套好几个VC,这种做法就是Fragment的来源。4.0以前,很多Android应用的开发是很挫的,比如开源中国客户端的第一个版本。。。主Activity写了2000多行。tab切换的时候控制 View的显示,隐藏,这是多么蛋疼。。。。屏幕大了,View变多了,Activity没法管理这么多了,所以Fragment横空出世,类似ios VC嵌套VC的做法,Android中Activity管理Fragment,Fragment来管理自己的View,这样层级就变得非常轻松了。

知识:Fragment和Activity一样,都是视图管理器,有着自己的生命周期,它的生命周期依赖于Activity

重点:Fragment和Activity不一样,是开发者自己实例化的。实例化完,加到容器里面。这边主要有两种方法:

1,用replace,每次都会回调Fragment的oncreate和ondestroy,这种简单粗暴的做法,用处很少

2,用add和show(),hide()。这样每次创建完,show或者hide,什么生命周期都不调用,那比如说第一个tab切换到第二个tab,想在Fragment做点事怎么办呢,用我添加的onhiddenchanged()这个生命周期,在这里面操作。

好了,下一章讲Service。我的风格是纯原创,不抄,感谢大家支持。

Service:

今天我们来讲Service,这是个强大的组件,在后台执行任务,只要系统不回收,又不手动停止,它就在后台一直跑着。

注意:Service是在主线程的,要耗时的操作,起一个Thread吧

这个生命周期相对简单,我就稍微讲讲,进程间通讯用bindservice()启动,进程内就这这么干了,没啥意义,用startservice()吧

启动完第一次当然是onCreate()啦,然后onStartcommand(),销毁的时候onDestroy(),以后startservice()的时候,就不调用onCreate()了,直接从onStartCommand()了,

然后Service和Acvitity通信,就用万能的广播吧,说完了。

然后说说IntentService,这个Service的之类,也是相当有用,自动起一个带Looper循环的线程,onhandlerIntent()这个回调方法就是在线程中的,多任务队列执行,执行完自动destroy,省了不少事。

IntentService的源码大家可以看看,一共就不到200行,还是挺有趣,挺好理解的。

好了,这个篇幅完了,相信大家一定大有收获。

PS:

欢迎大家关注我的微信公众号"大土豆爱开发",技术包括但不限于JavaEE,Android,Git等。