• Android Service 的生命周期


    Service作为Android四大组件之一,主要分为两种,Service和IntentService,启动方式也分为两种,startService和bindService,接下来通过代码来演示这几种之间的区别。

    Service 分类

    Service

    普通的Service,其内部的任务执行还是在主线程中,因此不可以放置耗时任务,除非开辟新线程。

    IntentService

    自带一个执行任务的线程,需要重写onHandleIntent方法,该方法运行在子线程中,可以执行耗时任务。 onHandleIntent()只有在使用startService()的时候才会调用,如果只是绑定,则相当于把IntentService当普通Service用了。

    Service 启动方式

    startService

    与Activity的关系:通过这种方式启动的服务,与Activity本身没有依存关系,当Activity被finish()的时候,服务仍然存活。 需要停止时:在Activity中调用stopService()来停止。(IntentService会在任务完成后自己死掉) 服务的生命周期:onCreate → onStartCommand → onStart(不建议重写) → onDestroy 多次调用:会多次执行onStartCommand,不会多次执行onCreate。

    bindService

    与Activity的关系:通过ServiceConnection与Activity建立联系,该服务依存于Activity。当Activity被finish()的时候,必须将服务解绑**(即在onDestroy()中unbindService())**,否则会出现内存泄漏并报错。 需要停止时:在Activity中调用unbindService()来停止。(bindService的方式启动IntentService没有意义) 服务的生命周期:onCreate → onBind → onUnbind → onDestroy 多次调用:什么也不会发生。

    先startService再bindService

    与Activity的关系:startService(无关) → bindService(相关) → unbindService(无关)。在与Activity相关期间,如果Activity结束,未解绑Service,则会报错。无关期间,activity结束,Service不会结束。 需要停止时:依次调用unbindService()和stopService()进行停止。只调用unbindService()只会unbind,不会停止;只调用stopService()什么都不会发生。 服务的生命周期:onCreate → onStartCommand → onBind → onUnbind → onDestroy rebind():在调用了startService的情况下,如果将Service的onUnbind()方法返回值设置为true,对任务解绑再绑定时,就会调用Service中的rebind()方法。(猜测这里onUnbind()返回值的意义是 是否还会有下次绑定)

    先bindService再startService

    与Activity的关系:bindService(相关) → startService(相关) → unbindService(无关)。在与Activity相关期间,如果Activity结束,未解绑Service,则会报错。无关期间,Activity结束,Service不会结束。 需要停止时:依次调用unbindService()和stopService()进行停止。只调用unbindService()只会unbind,不会停止;只调用stopService()什么都不会发生。 服务的生命周期:onCreate → onBind → onStartCommand → onUnbind → onDestroy

    总结

    • 绑定对应onBind(),解绑对应onUnbind(),启动对应onStartCommand()
    • 绑定服务要比启动服务更加牢固。(未解绑前,stopService()无用)
    • Activity结束前必须解绑之前绑定的Service
    • 绑定服务的意义是与被绑定Activity通信。

    Service 保证存活

    1. 开两个服务互相唤醒启动
    2. 监听系统广播启动
    3. 设置服务优先级
    4. 设置为前台服务。(重写onStartCommand,加一句startForeground(),重写onDestroy(),加一句stopForeground())
  • 相关阅读:
    第87天:HTML5中新选择器querySelector的使用
    第86天:HTML5应用程序标签和智能表单
    第85天:HTML5语义化标签
    第84天:jQuery动态创建表格
    第83天:jQuery中操作form表单
    第82天:jQuery中prop()和attr()的区别
    第81天:jQuery 插件使用方法
    第80天:jQuery插件使用
    第79天:jQuery事件总结(二)
    对事务的特性ACID的理解
  • 原文地址:https://www.cnblogs.com/pravez/p/12620818.html
Copyright © 2020-2023  润新知