美文网首页安卓基础知识Android知识Android开发
10个你不了解的Service特性(翻译)

10个你不了解的Service特性(翻译)

作者: 石器时代小古董 | 来源:发表于2017-03-03 21:42 被阅读133次

    原文链接:https://medium.com/@workingkills/10-things-didn-t-know-about-android-s-service-component-a2880b74b2b3#.fo2ncjy3b
    从评论里学到一句话

    It's only for sharing for this knowledge,no commerical intentions.

    一、Service不是一个好的异步任务

    它不是用来执行异步或者后台任务的,它的目的是在activty变的不可见的时候更好的去执行逻辑的。把它当做是一个不可见的activity。
    记住任何一个Service都是一个特殊的组件,它不仅对需要你应用的成本,同样消耗整个系统的成本

    二、Service默认是运行在主线程的,和你的Application在同一个进程中

    你可以让它在另一个进程中工作,但你应该避免这样做,除非在非常有必要的情况下,并且你了解所有为它工作所分配的资源。

    三、IntentService没有什么神奇的

    它通过创建一个HandleTheard工作,所有要完成的工作都在HandleThread的队列中。它是一个更容易在service外使用的技术。
    这是一个简单的案例,只有164行 check it out!

    四、在同一时刻只能有一个实例

    无论你如何创建它,在同一时刻永远只能有一个实例,即使外部的应用和进程在和它交互

    五、Service可以被很容易的杀死

    不要认为内存压力是一个例外的条件:设计你的应用程序优雅的被系统重启,这是它生命周期的一部分。你可以通过添加 foreground标签让这个服务变得难以杀死,前提是这样做很有必要。
    注意哪些运行在以下生命周期里的代码: onCreate(), onStartCommand(), or onDestroy(), 这些代码会被视为在前台运行,哪怕是它们没有。
    看这里 here 去了解他们被杀死的过程。

    六、一个Service可以通过打开和绑定的方式同时启动

    只要有组件绑定它,那么它就不会被明确的停止(即有可能不能正常停止)------解除所有的绑定不会终止正在运行的Service,除非它已经明确的停止运行。同样要注意无论你调用了多少次startService()启动一个服务,一个简单的stopService() 或者 stopSelf()就能让它停止。

    图片来自于连接网站

    七、使用START_FLAG_REDELIVERY 避免传输数据时丢失

    如果当你在启动一个service的时候传递了数据,请在onStartCommond中返回START_FLAG_REDELIVERY标签,这样可以避免服务在进程中被杀死导致数据丢失的问题。

    八、可以隐藏部分前台通知。

    启动一个前台的通知同时会在顶部的状态栏显示一个通知。通过设定PRIORITY_MIN 这个优先级值,可以将这个通知隐藏(这个通知会存在于顶部提示栏的阴影中)

    九、在service中可以启动一个activity

    每一个context环境都不一定是activty的context。你可以通过添加 FLAG_ACTIVITY_NEW_TASK 标签在service中启动一个activity。

    十、在service中你应该使用单一职责的原则

    难以置信的是,你不应该在service中执行复杂的逻辑,而应该把他们放到分离出来的其他类中。这样做的好处是,你可以在任何地方启动它。

    相关文章

      网友评论

        本文标题:10个你不了解的Service特性(翻译)

        本文链接:https://www.haomeiwen.com/subject/sypkgttx.html