Android写的播放器控制之starService和bindService混合使用知识总结

          最近在复习Service的使用,写了一个音乐播放器。startService不能拿到Service对象的引用,进而不能在音乐播放的过程中控件播放器,比如上一首,下一首,暂停等。于是就使用了bindService,但是使用bindService也有问题,由于bindService方式启动的Service的生命周期和打开他的Activity一致,就使得即使你没有调用unbindService时,Activity退出时,service也会退出,调用onDestory。音乐就不能在后台播放了,这显然不能满足要求。

          两种方式都不行,但是我又不想放弃放弃bindService的特点,跑去用广播的方式来控制音乐播放。网上搜到了有些人说使用

startService和bindService两种方式混合使用。我尝试这么做了,先调用startService,再调用bindService,如下:

   if (songPathList != null && songPathList.size() > 0) {
            Intent bindService = new Intent(MainActivity.this, PlayService.class);
            startService(bindService);
            isConnected = bindService(bindService, musicServiceConnection, BIND_AUTO_CREATE);
        }

跑起来试验一下,确实可以利用bindService来控制上一曲和下一曲,并且退出的时候,音乐还在继续播放。

对于这个现象,我有以下几个疑问:

1. startService和bindService一起调用的时候,它们启动的是同一个Service吗?进而控制的是同一个播放器吗?

2.startServie和bindService一起调用 的时候,当Activity退出的时候,Service的生命周期是怎样的呢?

对于这两个疑问,我做了一些试验。我的操作步骤是:

1.首次打开app——>2.点击播放按钮——>3.退出app——>4.再次进入app——>5.点下一首——>6.点暂停——>7.退出app

打印的日志如下:

1.

 2019-04-28 15:50:50.611 4055-4055/com.demo.service D/PlayService: ---------onCreate,初始化播放器,只执行一次
2019-04-28 15:50:50.621 4055-4055/com.demo.service D/PlayService: -------------onStartCommand,执行多次:com.demo.service.service.PlayService@1b1c6f
2019-04-28 15:50:50.621 4055-4055/com.demo.service D/PlayService: --------------------onStart
2019-04-28 15:50:50.623 4055-4055/com.demo.service D/PlayService: -------------------onBind:com.demo.service.service.PlayService@1b1c6f

2.

2019-04-28 15:51:24.175 4055-4055/com.demo.service D/PlayService: -----------------音乐开始播放,bindService调用的

3.

2019-04-28 15:51:40.094 4055-4055/com.demo.service D/PlayService: -------------------------onUnbind:com.demo.service.service.PlayService@1b1c6f

4.

2019-04-28 15:52:07.919 4055-4055/com.demo.service D/PlayService: -------------onStartCommand,执行多次:com.demo.service.service.PlayService@1b1c6f
2019-04-28 15:52:07.919 4055-4055/com.demo.service D/PlayService: --------------------onStart

5. 下一首

2019-04-28 15:52:12.580 4055-4055/com.demo.service D/PlayService: ---------------------下一首,bindService调用的

6.暂停

2019-04-28 15:55:41.950 4055-4055/com.demo.service D/PlayService: -----------------音乐暂停,bindService调用的

7.退出

无log

从上面的日志打印,我们来总结几点结论:

1.  自始至终我们的PlayService对象都是 @1b1c6f ,这说明我们多次调用startService和bindService它们启动的都公用同一个Service,这样就更好控制了,不至于混乱。

2.首次进入Activity,startService和bindServie都调用,会执行startService触发的onStartCommand和onStart方法,也会执行bindService触发的onBind方法。 

3.首次退出Activity,在MainActivity里调用unbindService方法时,会触发onUnbind方法,但是不触发onDestory方法。音乐不停止。 

4.再次进入Activity,调用startService和bindService时,只会执行startService触发的onStartCommand和onStart方法,bindService不会触发onBind方法。

5.虽然没有再次触发onBind方法,但是MainActivity还是执行了onServiceConnected方法,说明Service和MainActivity还是关联上的,还是可以使用service对象引用来控制播放器上一曲,下一曲等操作。

6.再次退出Activity时,由于进来时Service没有调用onBind方法,这次退出onUnbind方法也没有执行。并且onDestory方法仍然没有执行。如上面步骤7,什么日志都没有打印。

 

下面把整个流程的日志截图贴上来,用于方便观看分析:

项目代码如下:https://github.com/tomyZhou/simple_service_music_player如果对你有用,欢迎start一下,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值