您的位置:首页 > 移动开发 > Android开发

Android的四大组建Service 简单、易懂的解析

2016-08-10 22:41 288 查看

                              Android的四大组建Service 简单、易懂的解析

Service 服务:

四大组件之一

特性: 没有界面运行在后台,除了界面相关的之外,Activity能做的Service也能做。

service的生命周期:



上图所述一共有两种服务,一种是直接通过意图打开的服务 与打开的应用无关,第二种为跟应用绑定在一块的服务。程序死了 服务也就跟着死了。

声明要素

1. 声明一个类继承Service

2.在清单文件中声明



开启服务:



涉及的生命周期:

onCreate ---- > onStartCommand()

注意:

1. 第一次开启服务的时候会调用onCreate()onStartCommand().

如果服务已经开启再次调用startService(),不会开启新的服务对象,只会调用已经开启的服务的onStartCommand()方法。

2. startService()方法开启的服务,在界面关闭之后服务依然存在,下次开启一个新的界面调用startService(),依然不会打开新的服务,只会调用当前服务的onStartCommand()。

3. 通过startService()开启的服务,只能通过stopService()关闭。

注意: startService()跟stopService()不一定要在同一个界面中调用。
关闭服务:



生命周期:

onDestroy()

2.3 把Activity中的数据传递给Service

Activity:



Service:



2.4 Service传递消息给Activity

场景描述:

a.在Activity中除界面相关的部分,其他代码代码功能也能在Service执行。

b.Activity一旦被关闭,对象就销毁,对象一旦销毁保存的数据也就消失,下次再打开就一个新对象。

c.Activity关闭但是Service还在,Service不会受到Activity关闭的影响。

需求:

当Activity关闭的时候把Activity上的信息保存到Service中,因为Service不会关闭,然后下次打开新的Activity从Service上把信息读取回来,显示在Activity上,让用户认为界面还是一样。

问题:

startService()开启的服务可以运行在后台,并且可以接收Activity传递的消息,但是无法获取Service中保存的信息。

解决: 绑定服务





生命周期:

onCreate() onBinde()

注意:

1. 绑定成之后再次绑定没有效果

2.绑定成功之后Service的生命周期就跟Activity绑定在一起了,

一旦Activity关闭Service也随之销毁。

3.Activity关闭之前如果没有解除绑定的话,会造成绑定泄漏,所以一般在Activity关闭之前会解除绑定

2.4.2 解除绑定



生命周期:

onUnBind() onDestroy()

注意:1.通过bindService()开启并绑定的服务,一旦调用unBindService()解除绑定,Service就销毁掉。

2. 如果已经解除绑定再次解除绑定就会异常

2.4.3 Activity跟Service之间的消息传递:

Activity ----> Service:

Activity:



Service:

在onBind()中接收



Service -----> Activity

步骤:

1. MyService这个类中有一个成员变量:String msg

我们希望在Activity上可以显示这个数据

所以的把MyService上的数据传递到Activity上

2. 在绑定的时候,如果绑定成的化,调用Service中onBind()要求传递一个IBinder类型对象的引用,给Activity中ServiceConnection中的onServiceConnection()方法。

3.IBinder是一个接口,所以我们可以在MyService中声明一个内部类MyBinder 继承Binder(Binder实现IBinder接口),因为MyBinder是MyService的内部类所以可以调用MyService的成员变量,又因为MyService是我们自己声明所以我们新增方法以及成员变量,通过新增方法去调用MyService的成员变量。

onBind()要返回一个IBinder类型的对象的引用我们就给他一个MyBinder对象的引用。



4.绑定成功之后,onBind()返回的IBinder类型对象的引用会在调用ServiceConnection类型的对象的onServiceConnected方法传入,因为我们ServiceConnection声明成Activity的内部类所以可以在这个方法中调用MyBinder对象的方法获取对应的数据,并显示在Activity上



问题:

通过绑定可以获取Service上保存的信息,但是绑定Service的话Activity关闭Service也随之关闭,信息也就销毁。

我们想要实现是消息可以保存在Service中,并且也能从Service中获取消息。

解决:

分析:

a.bindService()帮服务可以获取服务信息,但是Activity关闭Service也关闭

b.startService()虽然无法返回信息,但是activity关闭service依然存在,必须通过stopService关闭。

先通过startService()开始服务,然后再去bindService()绑定服务。

好处: 先startService()开启服务,只要没有stopService()服务就一直在,这样就可以用于保存信息。

再通过bindService()去绑定已经开启的服务也可以获取信息,当界面关闭的时候只会解除绑定不会销毁Service,下次再开启界面可以通过绑定再获取信息。

------------------------------基本的服务就介绍完整了-------------------------

有时候要这两种服务配合使用。 接下来的实例是 模仿一个音乐播放器进行

1.

.在Activity开启的时候获取播放器对象并操作

一般在onStart() 中

先startService(),在bindService()

一般在onStop()中解除绑定

界面关闭之前解除绑定不会绑定泄漏

2.

在每次打开界面绑定的时候去获取Service中保存的MediaPlayer对象的引用给Activity

在Myservice中声明一个内部类新增一个方法用于返回Service中成员变量MediaPlayer的引用

下面会贴出代码下载地址 :

Demo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: