zoukankan      html  css  js  c++  java
  • 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())
  • 相关阅读:
    腾讯加入QQ群,代码生成地址
    jsTree 是一个基于Javascript,支持多浏览器的Tree view jQuery插件。
    PHP Ajax 跨域问题最佳解决方案
    【转载】目前主流过滤XSS的三种技术
    nginx中location、rewrite用法总结
    Tomcat请求头过大
    ssh秘钥分发错误“/usr/bin/ssh-copy-id: ERROR: No identities found”
    ssh分发秘钥时出现错误“Permission denied (publickey,gssapi-keyex,gssapi-with-mic)”
    修改Jenkins用户的密码
    注销/etc/passwd带来的系统登陆不上
  • 原文地址:https://www.cnblogs.com/pravez/p/12620818.html
Copyright © 2011-2022 走看看