00:00
啊,关于这个思维使用,这是我们今天要分享的一个内容,这呢是有一个复习啊,其实这个呢,大家也参照着我们原来上课每天的复习的时候用的那个复习资料也行哈,这呢我又呃关于这个service这块呢,又稍微整理了一下,那通过这个呢,我们把这个service这个使用的话呢,今天相当于就得大家整清楚啊。啊,屏幕播一下我播了。啊,这个啊这。哎,这个的话呢,也可以一会完了以后发给大家啊,我们看下这个service这一块,就除了这一块呢,别的这这也都有啊,其实整个我们上课讲的时候呢,其实也都讲到了,呃,关于这个service的话呢,我们说了这个内容的话呢,跟STP相比的话呢,要少一些了,呃,本身我们在这个写项目当中呢,其实用service的机会呢,呃,有啊,但是相对呢也会少一些,这块呢,主要你搞清楚呢,怎么去用。
01:00
啊,主要用这块呢,其实有两块需要主要关注的,一个呢,就是呃,如何我们去启动和停止服务,另外一个呢,就是服务的一个分类啊分类呢当中呢,我们这个如果自己去创建service的话呢,那基本上都是以本地服务的方式出现的,那如果我们调用系统的服务呢,那就相当于远程的啊这两种,呃,这个分类以及这个分类里边呢,具体怎么去用。啊,这个呢也要清楚哈,所以说呢,主要两块内容就是一个呢,就是使用怎么去启动这块,另外呢,就是关于分类这块呢,这样的一个区别。以及呢,就是生命周期,那就是具体这个在这个使用过程当中呢,啊,我们应该在哪些生命方法里边去写哪些操作的一个问题了啊先整个来看的话呢,关于service的一个理解,嗯,它呢主要是跟activity t做个对比啊就是呃体现为在后台,呃跟activity t呢提供了一个界面是不一样的了啊另外呢,说到呃时间跨度比较大,这呢又跟thread做一个对比,呃thread呢说执行时间比较长的话呢,啊按卓当中要求我们必须在一个新的线程当中去做,而这个thread呢,我们把它service呢,我们通常把它描述为一个哎,时间跨度比较大。
02:08
啊,体会一下这两个一个区别啊,啊具体呢,关于这个activity,这是咱们上课时候呢用的这个课件了,啊这个详细的话呢,就不在这说了,主要呢,这个选择标准就是看一下是不是需要给用户呈现一个界面啊,需要的话呢,就it,不需要呢就用service。啊,相应的来讲,我们说service的生命周期,哎,整个来看是不是比这T要稍微长一些。啊,因为它可以在后台执行嘛,嗯,好,然后另外一个呢,是关于这个thread这个对比啊,一个呢叫时间跨度大,一个呢叫执行时间长,它两个呢看似是矛盾的,而实际我们在使用当中呢,它俩实际上是一个搭配关系。啊,是一个搭配关系啊,如果说呢,我们执行一个比较耗时的一个操作啊,那这个时候呢,其实你还可以把这个耗时的操作呢,就是在一个service,首先呢,让他在后台执行,后台里边呢,我们再去起一个线程去执行。
03:01
啊,那跟我们直接起个线程有什么区别呢?我们直接起一个线程,那就意味着你是在activity里边起的。那就是意味着在ATT里边起一个threatad,跟service里边起一个threatad,那又有点什么不同呢?这一会我们有这样的一个题目啊,一会来看啊。呃,相关的API,那其实就是涉及到service的一个生命周期方法啊,这块就不多说,呃,另外呢,我们如何去创建一个service啊,其实它就是一个组件呢啊,就按照组建那个套路来就行啊,直接用一个service的一个子类,然后该注册注册啊,然后呢,重写生命周期方法啊,相应的你要做什么事情在这里边去完成。啊,那这个future呢。就主要看你是不是一个本地服务了。那如果是一个本地服务,其实这个是不是也没有必要配啊。啊,是啊。好,下面的话呢,需要大家掌握的第一个啊,就落地的话,你需要掌握的就是关于service的一个启动和停止。当你创建完以后,我们在比如说现有的it当中,我想启动一个service了,哎,这有两种方式,Start跟band,哎刚才呢,这里都说到了啊,这两种方式的一个对比。
04:10
有什么区别呢?我们到底应该用哪一种啊?这个应该怎么去说呀。啊,这里边儿呢,我们当时讲课的时候也提到了,如果概括点来讲的话呢,哎,我们提到了这个首先呢,生命周期方法不一样。但我们这里边儿呢,一共是有两套生命周期方法,一个呢就是start的,一个是band。啊,这个是一个比较大的一个不同点哈,那另外的话呢,就是呃,这两种方式跟它的启动者。比如说是activity哈,之间的这种关联关系的话呢,也不太一样。谁是有关联关系的呀,哎,办的那就意味着办的,如果我通过这个ACTIVITY1,哎,我绑定了一个SERVICE1吧,那那意味着当我这个itp在销毁的时候呢,或者要退出的时候呢,是不是一定要解绑啊,哎,这个呢,说明他们之间有关联关系啊,而这个star的方式呢,就没有。
05:08
呃,概括来讲的话呢,就是这样子哈,那要细节来说的话呢,就是咱们上课里边说的还是比较多的哈,呃,就是除了刚才讲那个之外呢,比如说我们还提到这个star这个方式。我们可以实现呢,呃,Activity,像这个service呢,去传送数据就放在这个in Internet里边,哎,当然绑定的方式呢,也可以绑定这个方式里边呢,我们同样的啊,呃,去提供一个in Internet里边照样可以传数据,但同时的话呢,我们这个呃service其实它还会返回一个是不是on service connected那样一个方法啊。哎,那个方法里边实际上相当于就是你要用绑定这个方式呢,它还可以给我们传回一个是不是I班类型的一个变量啊。哎,就是这里边涉及到这个数据呢,往回返这样的事情,哎,那我们调用远程服务呢,其实也正式使用了这样一个点啊,我们自己这有一个应用的activity,哎,我绑定远程的一个服务,比如说远程的一个通话的一个服务哈,哎,我们通过这个AI drl呢去实现的,哎绑定的时候呢,他就给我们返回一个I班类型的一个变量啊,就是我们比如说那个通话的那样一个I telephone。
06:16
啊,如果还有印象的话啊,哎,我们在本地这个AI文件生成的这个账号类当中,我就可以使用它返回的这个对象。啊,这个呢,是其他的这个方式所不具备的啊,他这其实有,呃,反过去他还可以给我们传回来一个东西啊,而这个呢,就是单向的只能够往这块去发。啊,详细的话呢,这个就下来呢看一下啊,嗯,再者呢,就是关于分类,分类呢就分成本地和远程分类的方式呢,其实也非常简单,就是看一下你这个service对象和它的启动者是不是在同一个进程里面啊是呢,就是通过这个启动者启动本进程的service。啊,那就是本地的了,那启动的是另外一个进程当中的service,那当然就是远程的了,那远程的话呢,我们这里边说,呃,针对于服务,哎,专门我们提供了叫AIDL呢,来实现进程间的一个通信。
07:08
啊,就是我们在通过比如说这个activity,当前这个应用的啊,启动另外一个应用的具体的一个service。啊,就比如说我们通话的那个通话服务啊,呃,这个时候呢,我去呃绑定它,然后呢,他给我们返回来一个相应的一个安班的类型的对象,哎,我们本地呢,就提供一个AIDR文件,哎然后呢,就是具体我们这有个实时步骤啊哎造一个跟那个文件里面报名一样的一个包,哎然后呢,Rebu一下,他就给我们生成相那个包里个类,哎然后在那个类里边呢,哎,我们就相应的这个抽样方法,哎然后你反馈那个对象呢,实际上往那个方法里边stop里边一放as interface是来,就给我们返回一个你这个类型的对象,然后在对象上就叫方法就行。啊,这个具体这个实施的话呢,那这个可以回来再去看一下啊。啊,嗯,这是这个事情,这就相当于是在服务当中,我们使用这个A调的一个体现。
08:05
啊条这个体现啊,那另外的话呢,就关于这个生命周期方法两套啊,这个毫无疑问啊,这个作为基本点肯定是要会的啊这呢有一个两个三个啊这呢一个两个三个四个。啊,他俩一对,他俩一对。啊,这里边儿呢,就是这两一对,它是单蹦一个。哎,然后呢,就是我们具体的去测试了啊,测试的时候呢,这个过程呢,也得了解一下。嗯,尤其是当我们这个star的这种方式,Star这种方式呢,说如果我通过一个it去启动一个service。嗯。那主要呢,我是把这个启动的service要做的事情写到这儿还是写到这儿。嗯,主要的一个参考标准是什么呀。就是看你是不是执行一次是吧。呃,如果就像一些初始化类型的那个操作的话呢,写到哪。
09:01
是不是on啊对,因为他呢只第一次创建service的时候呢,去执行了。那后续如果就像咱们当时写那个播放音乐的功能一样啊,后续我不断的通过这个IP去操作这个service,那这个service呢,还是就那唯一的一个啊,这时候你写到这里不合适,因为它不掉啊,所以应该写在on star cloud里面。啊,因为每次你大的它都掉。那这时候呢,其实我们提到了一个service呢,实际上是一个是单立的呀。哎,在当前进程当中就一个啊,包括呢,我们用这个绑定的方式也是一样,我这有一个A1,我这有个service,他俩呢绑了一下,然后呢,我又通过这个A2再绑一下这个service。这时候你绑的这个service呢,其实还是一开始有的这个service,那就意味着呢,就是当你A1去绑的时候呢,这刚开始那on呢会掉,然后这个on b是不是也会掉啊啊,那如果我又通过AR再去绑这个service,维斯这时候生命周期方法掉哪个呀。
10:01
是不是光调用这个on band了,哎,对象那个on credit就不掉了,因为它就是用的这唯一的一个。啊,那行了,绑了两个,那如果我这时候A2呢,要退出了,很显然你需要解绑,我解绑的时候呢,这个四位词会掉哪个方法呀。On安版的是吧,啊,那会调这个on destroy不会,因为这时候是不是还有其他的,嗯,RT里绑定的呢是吧,所广为调这一个啊,然后当我这个LTA1啊也解绑了。是不是先是on on band,然后再on Detroit?啊就这样啊,再销毁那行,如果说呃,在你这个解绑之前,还还有一个什么呢,还有另外一个it,我这写个A0吧,这个呢,我是通过启动的方式,呃,通过start的方式把你启动的哈。这就相当于一开始有这是两个绑定,这是一个启动的啊,那如果我结束的时候呢,是这个先解绑,是不是还是这个方法,然后这个也解绑。
11:02
这时候这个还这个没有结束啊,这个解绑第哪个。版的这个调吗?不掉,因为这时候是不是它还起着呢,哎,所以这时候呢,就是呃,仍然也只掉它啊,当你A0我再去做一个嗯,Stop的时候呢,哎,他才会去调这个行。哎,就是这样一个意思啊,就整个进程当中就是一个对象啊,你不能在其他这个线程,呃,其他这个启动者使用的情况下呢,你把它给destroy了啊,这是肯定不能的。好,那具体这个测试的话呢,这个就清楚一下啊,这个绑定方式我们说就绑一次就行啊,那你出来的时候一定记得解绑。啊,要旺的话呢,这这就报那个是不是内存就泄露了。Service这块一样,包括我们后边那个广播接收器,就是解注册的时候也一样。哎,退出的时候记得解注册。啊,这个呢就过了啊,然后呢,我们说一下这个关于service本身我们用的机会呢,相对来讲少一点啊主要呢,在呃面试的时候呢,主要会提到哪几个点啊,第一个问题呢,就是关于生命周期。
12:08
哎,这块呢,需要大家去清楚啊,我们看一下。呃,在开发当中需要注意的service实例只有一个啊,也就是说呢,如果当前要启动的service啊,如果当前要启动的service已经存在了啊,那么就不会再去创建。哎,刚才我们说这个过程呢,也是说它了啊,进而呢,也不会叫on了。说一个service呢,可以被多个啊,这个启动者activity啊。进行绑定,嗯,只有所有绑定的对象都执行了啊安办的service方法之后,该service才会销毁。刚才我们说的其实也是这个事儿说不过呢,如果有一个客户呢,执行了昂达的方法,那么这个时候呢,所有绑定的这个客户,即使都执行了,他也不会被销毁。其实就是我们刚才说的那个实例的一个描述,对吧。能理解吧,这个事儿,嗯,好,这是关于生命周期里边的哈,另外一个呢,说什么时候我们会去用。
13:05
那这里边提供了三种情境啊,第一种就是我们的应用呢,在后台运行的时候呢,希望不被Q掉。呃,在后台运行的程序呢,如果时间比较长的时候呢,往往可能会被这个进程给你把后台这个系统呢,就给你杀掉了啊,或者到内存不足的时候呢,也会呢帮你把这个呃后台这个进程呢给你干掉,那我们希望我们这个应用程序呢,就后台一直呢是启动着的。啊,如果防止他被干掉。第二呢,就是呃,在后台执行监听的时候。啊,后台执行相关的一些监听服务啊,其实我们自己打开手机,你在这个应用程序,你看一下这个,呃,正在运行的应用程序当中有一些呢,它就起了一些服务。啊,监听你相应的一些这个变化啊,数据的一些变化和更新,那第三个呢,就是后台呢,下载数据的时候。呃,后台下载数据啊,那首先呢,下载数据呢,也提到了一个分线程啊,另外的话呢,我们还是在后台里边,所以说是service里边的去嵌到TH啊。
14:07
呃,原因是什么啊,这里边儿我们提到刚才这几个事情,这个拥有service的进程呢,具有较高的优先级。看这里边默认情况下service呢,其实是在主线当中执行的啊,如果你是执行这个复杂的耗时的操作,我们呢,就要把这个呃,需要在这个service里边呢去完成,同时呢,在service里边去创建一个threat。啊,这里边提到这个耗时啊,原来我们说到耗时的话呢,保持造一个thread,现在呢,还提到把这个thread呢,再包到这个service里。啊,下边一会那个面试题提到这个事情啊。然后service的优先级呢,注意这个事啊,Service的优先级呢,是高于后台挂起的activity。啊,高于后台挂起的it,所以我们可以呢,呃,让后台的时候呢,让service来去来处理这个监听,当然呢,也高于service所创建的thread,因此呢,系统可能在内存不足的时候,先优先杀死后台的it,或者是it中创建的thread,而不会呢轻易的去杀死service。
15:12
啊,即使被迫杀死的我们也可以呢,在资源可重用的时候呢,哎,把它呢,再启动起来。就是它的优先级比较高,所以呢,它相较而言TT来讲更适合于把后台执行的一些监听操作呢,写在它的里边。嗯。啊,具体的来看的话呢,就是嗯,这个已经说过了啊,在broadcast receiver里边。哎,广播接收器啊,我们可以这样去做,在在这个广播接收器当中,当这个广播接收器呢,捕获到一个世界。我们就可以呢,让这个事件当中去启动一个service,去完成一个比较耗时的一个操作。呃,这个原来我们讲这个服务和那个文化receive的时候呢,做过这个事情啊,就是拦截,呃,是不是黑名单的那个。
16:01
电话。嗯,那个一来电相应在我们这里边儿,嗯一个一个,呃,这一个是这个啊,这个还这个还不明确,不不明显,那个咱们还另外做了一个关于这个拦截黑名单的那个短信。啊,因为短信的话呢,一来短信呢,它会相应的发送一个广播,呃,我们这里边呢,就通过广播接收器呃,接收到这样的一个广播,呃同时呢,我们把自己的这个广播呢,设置成优先级最高。啊,避免系统的短信去接收到啊,那我们接收到这个广告以后呢,紧接着我就启动了服务,在服务里边呢,判断一下这个来电的这呃发短信的这个数据号码是谁谁谁的,进而呢,把这个呃短信呢给他屏蔽掉。哎,我们就可以呢,通过receiver里边启动service啊,去来做啊,执行耗时的操作。呃,如何避免后台的进程被杀死,其实呢,想要做的事呢,就是把service呢,首先制成一个前台进程啊,一旦被杀死,我们就在service的on里边呢,再去start他自己。
17:01
啊,死的时候呢,再启动一下,所以呢,这样就续起来了。就跟佛教里边讲的那个就是生死轮回一样,是吧,死了以后呢,你就又重生了。那所以他还死不了了,这辈子没完成的事,下辈子继续做,他们心态都比较好啊。啊,下面这个说在service里面呢,可以写对话框吗。就那个带的。应该说不合你就是因为他在后台是吧,哎,实际上是可以的啊,哎,Service里边呢,可以谈多少框,但是需要加权限。啊,加上这个权限啊,这呢你去造一个就可以了。啊,Dialogue,那build这个this,这是不是一个contest呀。他没有说这就得必须是一个activity,既然是一个contest service本身就是con实例,所以它也可以谈,但是呢,需要加权限。啊,然后另外呢,在service里边呢,可以透视了。
18:02
哎,你要按照这个套路来讲的话,是不是也可以啊啊,因为它本身呢也是个contest,如果不可以的话呢,这个位置那你还不如写个activity t呢,是吧?哎,他写conest说明可以啊。嗯,在下边说在service里边新开线程和直接新开线程的区别。直接新开线程呢,你可以理解为就在it里边开啊,直接在it里边新开个线程做耗时操作,就像我们做联网一样啊,当该itt呢,退回到桌面或者其他情况时啊,这就会成为一个叫背景呃进程。嗯。准确的说呢,就是你这个线程其实就变成了,就是你这个新开的线程,就叫一个背景线程。嗯,就是咱们当时写那个播放音乐的时候那个功能啊,我把音乐打开了,然后我退出了啊,FTP呢,其实也没有销毁啊,那个时候呢,你发现那个音乐还在播,那其实那个时候播音乐的那个先生呢,它就是一个背景的一个先生。啊,那如果在这个service里边去新启动一个线程,那这个线程呢,我们主要提到一点,它的优先级呢,比一这样创建这个线程的优先级要高。
19:07
啊,优先级高的话呢,那你如果执行一些耗时操作啊,那你就建议优先呢,是在service里边,Service里边啊来去启动这样的一个线程,而且呢,呃,这个耗时操作呢,你还是一个后台执行的。啊,比如我们去下载一个应用啊,下载过程当中呢,我们这时候就把它切出去了,它就变成了后台操作,那这个时候呢,尽可能的在service里边去完成。啊,因为他的优先级比较比较低啊,有可能呢,就被这个系统呢给你杀掉了,而这里边呢,它就是被杀掉可能性就比较低了啊在这里边去完成,那下边呢是具体的一个说明。啊行,这个呢就不看了。整个关于这个service的其实内容不多哈。啊,比较有限啊,这个呢,不清楚的,再稍微熟悉一下。
我来说两句