zoukankan      html  css  js  c++  java
  • Android开发必须知道SERVICE的10件事

    这些年我在和其他安卓攻城狮交流时经常谈到的一个话题就是Service组件被开发者错误地理解,不管是新手还是老司机。这篇文章就是交流的成果。

    这篇文章不会讲解Service的使用方法,这个要去看官方的(被墙的)文档:
    http://developer.android.com/guide/components/services.html
    https://developer.android.com/intl/pt-br/reference/android/app/Service.html
    http://developer.android.com/training/run-background-service/index.html
    这篇文章总结了对于掌握Service至关重要却常常被忽视、误解、忘记的概念。

    1. Service不是更好的AsyncTask

    Service不是用来执行异步、后台操作的,它被创造的目的就是在Activity不可见时仍能执行逻辑,要把Service想成不可见的Activity。

    要记住每个Service都是有使用成本的特殊组件,不只是对于APP,更是对整个系统。

    2. 默认情况下Service在主线程运行

    可以选择让Service在其他线程运行,但除非必要情况时应尽量避免这么做,因为这么做是有代价的。

    3. IntentService并不神奇

    IntentService是通过创建一个HandlerThread并在其中排列逻辑来工作的,可以很轻松的跳出Service实现这种方式。

    IntentService是一个很简单的类,只有164行代码,去掉注释74行,可以自己去看看。

    4. 一个Service同时只能有一个实例

    不管怎么new,一个Service永远只能有一个实例,即使外部APP/进程与它交互也是这样。

    5. Service很容易被干掉

    不要以为内存少是很极端的情况,应该在编写Service代码时让它可以很优雅的处理系统对它的重启,这是生命周期的一部分。

    可以把Service标记为foreground让它更难被干掉,但应该只在必要时这么做。

    注意当执行onCreate()、onStartCommand()、onDestroy()方法时,Service被视作foreground虽然它并不是。

    下面这个链接可以告诉你你的进程有多么可能被干掉。
    https://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

    6. 一个Service可以在同时被启动与绑定

    明确的停止绑定了其他组件的Service并不会使它结束。解绑Service的所有组件而不结束它也不会使它停止。还有就是不论你调用startService()多少次,只需调用一次stopService()或stopSelf()就可以结束它。具体参考下图:
    Service LifeCycle

    7. STARTFLAGREDELIVERY可以避免输入数据丢失

    如果在启动Service时传入数据并在onStartCommand()中返回STARTFLAGREDELIVERY可以有效地避免在Service处理数据被杀死时丢失数据。

    8. 前台的通知可以被部分遮盖

    当一个前台的Service要发送一个通知时,可以传入一个优先级值PRIORITY_MIN来在状态栏中隐藏它,而在通知栏中仍然可见。

    9. Service可以启动Activity

    就像不是Activity的所有Context一样,Service可以在添加FLAGACTIVITYNEW_TASK标记时启动Activity。

    还可以显示Toast或状态栏通知,一样的道理。

    10. 可以引入单一职责原则

    最好不要在Service中写逻辑代码,而是分离在另一个类中,这样除了可以复用外,说不定还有其他好处。

    推荐:

    所有Android控件的学习以及service和广播的使用方法

  • 相关阅读:
    EM算法
    最大熵模型中的对数似然函数的解释
    PySpark 自定义函数 UDF
    PySpark 自定义聚合函数 UDAF
    Numpy总结
    Examples
    Examples
    Examples
    Examples
    Examples
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5817011.html
Copyright © 2011-2022 走看看