原文链接: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中执行复杂的逻辑,而应该把他们放到分离出来的其他类中。这样做的好处是,你可以在任何地方启动它。
网友评论