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

来源:互联网 发布:我的淘宝网 编辑:程序博客网 时间:2024/06/06 19:48

                              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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机号码注销了微信密码忘了怎么办 摄像师把婚礼资料弄丢了怎么办 青岛拍的婚纱照修的不好怎么办 鞋店剩的鞋都是小码的怎么办 淘宝想买的衣服下架了怎么办 买家要求到付仲裁发生运费怎么办 淘宝退货退款页面刷新不出来怎么办 淘宝退货退款快递单号写错了怎么办 淘宝上已经退款的店家还发货怎么办 千牛买家下单付款了卖家怎么办 京东货到付款支付宝支付退款怎么办 美萍餐饮管理系统下单错误怎么办 淘宝店上传宝贝显示空间不足怎么办 淘宝店品牌被投诉未授权怎么办 淘宝天猫退货单号填错了怎么办 淘宝退货我把快递单号弄丢了怎么办 唯品会退货快递单号填错了怎么办 天猫换货写错运单号怎么办 训练衣舍的店铺名连接怎么办 兼职模特被骗去微整还贷了款怎么办 卖家已经发货了我要退款怎么办 卖家显示发货单号信息查不到怎么办 淘宝申请退款卖家发货了怎么办 咸鱼卖家不发货好会自动退款怎么办 淘宝卖家涨价后不发货怎么办 淘宝卖家发货选错在线下单怎么办 申请退款后卖家又虚假发货了怎么办 公司用淘宝没发票做账怎么办 淘宝网买了假货确认了怎么办? 吃了安眠药睡了一天还没有醒怎么办 淘宝买的东西退货快递弄丢了怎么办 在淘宝上已付钱店家说没货了怎么办 从淘宝物流寄东西到国外被扣怎么办 不是天猫的淘宝卖家不发货怎么办 微店违规说卖假冒商品怎么办 云集微店的商品没货了怎么办 淘宝买家被检测有虚拟交易怎么办 媒体声音突然没有声音了该怎么办 华为微信运动步数为零怎么办 淘宝店铺没货了客户拍了怎么办 房子涨价了卖家反悔不卖了怎么办