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()等),开发者可以创建自己的服务来处理后台任务。
核心类
-
Service
- 作用:
Service是所有服务的基类,提供了服务的基本框架。开发者需要继承这个类并实现其中的方法来自定义服务的行为。 - 核心方法:
onCreate(): 当服务被创建时调用,通常用于初始化服务。onStartCommand(Intent intent, int flags, int startId): 当服务接收到新的启动请求时调用,可以返回服务的启动模式(如 START_STICKY)。onBind(Intent intent): 当服务被绑定时调用,返回一个IBinder对象,允许客户端与服务进行交互。onDestroy(): 当服务不再被使用且即将被销毁时调用。
- 作用:
-
IntentService
- 作用:
IntentService是Service的子类,它使用工作线程来处理所有启动请求,因此它不会阻塞主线程,并且能自动停止服务一旦所有请求都被处理完毕。 - 核心方法:
onHandleIntent(Intent intent): 在工作线程中调用,用于处理每个启动请求。开发者需要重写这个方法来实现具体的任务逻辑。
- 作用:
-
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_STICKY、START_NOT_STICKY和START_REDELIVER_INTENT。这些模式决定了服务在何种情况下应该被重启,以及是否应该重新传递最后一个 Intent 给服务。
总的来说,Android Service 提供了在后台执行长时间运行操作的能力,而无需用户界面的干扰。通过继承 Service 类或 IntentService 类,并实现相应的生命周期方法和任务逻辑,开发者可以轻松地创建和管理自己的服务。