android service

来源:互联网 发布:c语言字符串单引号 编辑:程序博客网 时间:2024/06/05 10:54
为什么需要Service?
    Activity作为常见的和客户交互的
组件之一,我们可以在Activity中播放音乐
下载音乐。但是一旦我们退出Activity的时候,
因为Activity被销毁了,为了安全性,也会
停止播放和停止下载。
    但实际上,我们希望Activity退出后,
下载和播放不要停止。  所以,可以用Service
实现该需求。


Service和Activity的关系:
    Service和Activity一样都是组件,
都需要自定义其子类,并且在清单文件中注册。
除了不能做界面,Service能实现Activity可以
实现的任何事情。


案例:实现Service后台服务。
    1,自定义Service子类。
        重写抽象方法
        onBind

    2,注册Service

    3,在MainActivity中点击按钮启动后台服务。



后台服务Service的两种启动方式
    1,bind
    2,start

简单介绍两种启动方式的区别:
    bind方式:以bind方式启动xx后,可以获得启动的服务的引用,进而操作xx yy 00.
    start方式:xx xx xx


界面增加: start按钮,stop按钮。
分析:
    1,需要采用Intent startService()
    2,重写自定义Service里卖弄的
        onCreate
        onStart
        onDestroy()
    3,点击start,查看打印
      点击stop,查看打印



小知识:
    我们玩手机的时候,根本没有手动
启动某些app,但是会弹出这些app没有响应。
因为这些app的service里面做了耗时操作。
所以service虽然我们称其为后台线程,
其实不对,因为service只是优先级比
activity高,系统在一般情况下不会回收service
所以service可以做一些长久的事情,而不被影响。
但是Service和Activity一样都是组件,
自身是不能做耗时操作的,还是得交给子线程


为什么Service和Activity自己里面不能做耗时操作?
    Activity不能做耗时操作,
因为Activity还要处理界面的各种事情,
一旦做耗时操作,这些操作就不能实现。
    Service应该有类似的操作。


startService的基本玩法:
    点击 start按钮,查看日志
    点击 stop按钮,查看日志。



startService的高级玩法:
    多次点击start按钮,发现只做onStart
说明,在Service的一次生命周期里面,都是单例模式。
所以,把Service每次都要做的事情放在onStart里面。
比如:根据路径下载资源。
比如:播放不同的歌曲。


    多次点击start按钮,然后点击stop,
然后多次点击stop。  发现没有用。 因为都没有服务实例
可以让你关闭,当然没什么卵用。


    多次点击start按钮,点击stop,点击start



增加bind和unbind按钮
    用id的形式得到四个按钮,都增加同一个点击者。在同一个onClick方法里面,根据id判断是哪一个按钮。


我擦:在将绑定服务端时候,竟然用http连接成功与否来解释
    bindService(intent,conn,flags);

conn:里面就做了ok fail的回调。


步骤:
    1, 点击bind按钮
        打印 create bind
    2,点击解绑按钮
        打印 unbind destroy

高级bind玩法:
    1,点击start按钮
        打印 create start
    2, 点击bind    
        打印 bind
    解释:单例模式,都是一样的代码,为什么要搞两份呢?

    3,点击unbind
        打印 unbind,没有打印destroy
    
    4,点击stop
        打印 destroy


    3-1,点击stop
        什么都没打印

    4-2,点击unbind
        打印 unbind destroy
        
总结:
1,Service创建值启动一次onCreate,如果对象存在,
无论后面多次start或者bind服务,都不会重新onCreate

2,只要服务没有被停止,且解绑,都不会被销毁。
    

应用场景:
两个Activity,一个是start服务,一个是bind服务,
不能说哪一个Activity destroy的时候,把服务也给
destroy吧,因为这些个服务还要给另外的Activity使用。


为什么能多次点击 stop按钮,但是unbind按钮不能?
    给出的解释是:停止服务的饿时候,会自动
检测服务是否存在,存在就是做,不存在就不错。
    但是 解绑服务的时候,不会自动检测是否
有绑定,如果没绑定,就会悲剧。


或者这么解释:
    start-stop是单方面的,我发了这个命令,但是我不负责任的。
    bind-unbind就像是结婚了。是互相的。是有因才有果,有必须有绑定,才一定有解绑。



问题:为什么Activity退出时,如果有绑定服务一定要解绑。

 

onDestroy(){
    super.xx();
    this.unDestroy();
}


问题:
    如何让绑定的服务,在Activity退出的嘿嘿,
这个服务不会被销毁?
    哈哈,启动服务,然后绑定服务,
    解绑的时候,就不会销毁服务了。

然后再次启动Activity的时候,就可以
    在onCreate中,绑定服务,继续操作服务了。


问题:
    如果启动的Activity在onDestroy()中
的onDestroy(){}里面有解绑。

    但是如果没有绑定服务,就退出Activity的话,
就会悲剧啦!!!!

所以,需要利用相关技术判断是否绑定,绑定才解绑。

    因为在绑定的时候,才会new出ServiceConnection,才会实例化,
所以利用null技术就可以。



案例:
    Activity利用Service来播放音乐。


退出的时候,还能播放。
能在Activity上面显示播放进度。
能实现上一首,下一首。



整理自教程

0 0
原创粉丝点击