Android Service源码解析

Android Service 是 Android 应用中用于执行长时间运行操作而不提供用户界面的组件。Service 可以在后台执行各种任务,如下载文件、播放音乐、执行位置更新等。在解析 Android Service 的源码时,有几个核心类和核心方法值得注意,它们共同构成了 Service 的基础架构和功能。

```java
package android.app;

/**
 * 抽象类Service是Android中用于执行长时间运行操作而不提供用户界面的组件。
 * 它继承自ContextWrapper并实现了ComponentCallbacks2接口,以便接收配置更改和系统内存状态变化的回调。
 */
public abstract class Service extends ContextWrapper implements ComponentCallbacks2 {
    private static final String TAG = "Service";

    /**
     * 构造函数,将Context设置为null,因为具体的Context将在attach方法中设置。
     */
    public Service() {
        super(null);
    }

    /**
     * 返回拥有此服务的Application实例。
     */
    public final Application getApplication() {
        return mApplication;
    }

    /**
     * 当服务被系统首次创建时调用。不要直接调用此方法。
     */
    public void onCreate() {
    }

    /**
     * @deprecated 已被onStartCommand(Intent, int, int)替代。
     */
    @Deprecated
    public void onStart(Intent intent, int startId) {
    }

    // 定义了一系列START_*常量,用于指示服务的启动模式

    /**
     * onStartCommand的实现,为了兼容旧版本的onStart方法,同时根据兼容性标志返回不同的启动模式。
     */
    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
    }

    /**
     * 当服务不再被使用时调用,用于清理资源。
     */
    public void onDestroy() {
    }

    // 实现ComponentCallbacks2接口的方法,用于接收配置更改和系统内存状态变化的回调

    /**
     * 抽象方法,当服务被绑定时,客户端可以通过返回的IBinder与服务进行交互。
     */
    public abstract IBinder onBind(Intent intent);

    // 其他与绑定、解绑、任务移除等相关的回调方法

    // 停止服务的方法

    /**
     * 停止服务,如果它之前被启动过。这等同于调用Context的stopService方法。
     */
    public final void stopSelf() {
        stopSelf(-1);
    }

    /**
     * 停止服务,并指定一个开始ID,只有当该ID与最近一次启动服务的ID匹配时,服务才会被停止。
     */
    public final void stopSelf(int startId) {
        // 省略实现细节,主要是调用ActivityManager的stopServiceToken方法
    }

    // 其他内部使用的API和字段

    /**
     * @hide 隐藏方法,用于内部将Service附加到系统。
     */
    public final void attach(
            Context context,
            ActivityThread thread, String className, IBinder token,
            Application application, Object activityManager) {
        // 省略实现细节,主要是进行一些初始化工作
    }

    // 其他内部使用的字段
        // set by the thread after the constructor and before onCreate(Bundle icicle) is called.
    private ActivityThread mThread = null;
    private String mClassName = null;
    private IBinder mToken = null;
    private Application mApplication = null;
    private IActivityManager mActivityManager = null;
    private boolean mStartCompatibility = false;
}

这个类包含了Service的基本框架和生命周期方法,以及用于与ActivityManager交互以管理服务状态的内部机制。通过继承这个类并实现必要的方法(如onCreate(), onStartCommand(), onBind()等),开发者可以创建自己的服务来处理后台任务。

核心类

  1. Service

    • 作用Service 是所有服务的基类,提供了服务的基本框架。开发者需要继承这个类并实现其中的方法来自定义服务的行为。
    • 核心方法
      • onCreate(): 当服务被创建时调用,通常用于初始化服务。
      • onStartCommand(Intent intent, int flags, int startId): 当服务接收到新的启动请求时调用,可以返回服务的启动模式(如 START_STICKY)。
      • onBind(Intent intent): 当服务被绑定时调用,返回一个 IBinder 对象,允许客户端与服务进行交互。
      • onDestroy(): 当服务不再被使用且即将被销毁时调用。
  2. IntentService

    • 作用IntentServiceService 的子类,它使用工作线程来处理所有启动请求,因此它不会阻塞主线程,并且能自动停止服务一旦所有请求都被处理完毕。
    • 核心方法
      • onHandleIntent(Intent intent): 在工作线程中调用,用于处理每个启动请求。开发者需要重写这个方法来实现具体的任务逻辑。
  3. ServiceConnection

    • 作用ServiceConnection 是一个抽象类,用于在客户端(如 Activity)与 Service 之间建立连接。当连接建立或断开时,系统会调用相应的回调方法。
    • 核心方法
      • onServiceConnected(ComponentName name, IBinder service): 当与服务的连接建立时调用,客户端可以通过返回的 IBinder 与服务进行交互。
      • onServiceDisconnected(ComponentName name): 当与服务的连接意外断开时调用。

原理

  • 服务生命周期:Service 的生命周期与 Activity 不同,它没有用户界面,因此其生命周期主要由 startService()stopService() 方法控制,或者通过绑定和解绑来控制(对于绑定服务)。Service 可以在后台长时间运行,即使启动它的组件(如 Activity)已经被销毁。

  • 工作线程:默认情况下,Service 是在主线程(UI 线程)中运行的,这意味着如果 Service 执行耗时操作,它可能会阻塞 UI 线程并导致应用无响应。为了避免这种情况,开发者可以使用 IntentService 或在 Service 内部创建并管理自己的工作线程。

  • 服务绑定:通过绑定到 Service,客户端(如 Activity)可以与服务进行交互,发送请求,接收响应等。这种机制允许 Service 返回一个 IBinder 对象,客户端可以使用该对象与服务进行通信。

  • 服务启动模式onStartCommand() 方法返回的值决定了服务的启动模式,如 START_STICKYSTART_NOT_STICKYSTART_REDELIVER_INTENT。这些模式决定了服务在何种情况下应该被重启,以及是否应该重新传递最后一个 Intent 给服务。

总的来说,Android Service 提供了在后台执行长时间运行操作的能力,而无需用户界面的干扰。通过继承 Service 类或 IntentService 类,并实现相应的生命周期方法和任务逻辑,开发者可以轻松地创建和管理自己的服务。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值