Android Service 从 1.0 到 16 的演进史

发布于:2025-05-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、Android 1.0(API 1) - 服务的诞生

核心特性

基础服务组件:作为四大组件之一,Service 用于在后台执行长时间运行的任务,不提供 UI 界面。

启动方式:通过 startService() 启动独立运行的服务,或通过 bindService() 与其他组件绑定通信。

生命周期:包含 onCreate()onStart()onDestroy() 等基础回调方法。

代码示例

public class MyService extends Service {

    @Override

    public void onCreate() {

        super.onCreate();

        // 初始化操作

    }

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

        // 处理启动请求

        return START\_STICKY;

    }

    @Override

    public IBinder onBind(Intent intent) {

        return null; // 不支持绑定

    }

}

二、Android 2.0(API 5) - 异步任务简化

核心特性

IntentService:引入抽象类 IntentService,自动处理线程管理和任务队列,开发者只需重写 onHandleIntent() 方法。

线程安全:内部使用 HandlerThread 处理异步任务,避免主线程阻塞。

代码示例

public class MyIntentService extends IntentService {

    public MyIntentService() {

        super("MyIntentService");

    }

    @Override

    protected void onHandleIntent(Intent intent) {

        // 执行耗时任务

    }

}

三、Android 3.0(API 11) - 多任务优化

核心特性

平板适配:针对 Honeycomb 系统优化多任务处理,Service 支持更灵活的后台任务调度。

进程管理:引入更严格的内存管理策略,优先保障前台应用资源。

四、Android 4.0(API 14) - 后台服务管理

核心特性

绑定服务增强:支持双向通信,客户端通过 ServiceConnection 获取服务实例。

后台限制:引入更严格的后台执行策略,限制后台服务对系统资源的占用。

代码示例

// 客户端绑定服务

Intent intent = new Intent(this, MyService.class);

bindService(intent, new ServiceConnection() {

    @Override

    public void onServiceConnected(ComponentName name, IBinder service) {

        MyService.LocalBinder binder = (MyService.LocalBinder) service;

        MyService myService = binder.getService();

        // 调用服务方法

    }

}, BIND\_AUTO\_CREATE);

五、Android 5.0(API 21) - 任务调度革新

核心特性

JobScheduler:引入任务调度 API,支持在指定条件(如充电、网络连接)下执行后台任务。

Material Design:优化服务通知样式,增强用户体验。

代码示例

JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB\_SCHEDULER\_SERVICE);

JobInfo jobInfo = new JobInfo.Builder(JOB\_ID, new ComponentName(this, MyJobService.class))

        .setRequiredNetworkType(JobInfo.NETWORK\_TYPE\_ANY)

        .setRequiresCharging(true)

        .build();

scheduler.schedule(jobInfo);

六、Android 6.0(API 23) - 省电模式

核心特性

Doze 模式:设备静置时限制后台活动,Service 仅在特定时段唤醒执行任务。

App Standby:根据应用使用频率限制后台活动,提升电池续航。

适配建议

使用 JobScheduler 替代 AlarmManager 执行定时任务。

避免在 Doze 模式下频繁唤醒服务。

七、Android 7.0(API 24) - 后台限制强化

核心特性

隐式广播限制:应用无法通过清单注册隐式广播(如网络变化),需动态注册。

后台进程限制:开发者选项中新增 “后台进程限制”,控制应用后台运行数量。

代码示例

// 动态注册广播接收器

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY\_ACTION);

registerReceiver(networkReceiver, filter);

八、Android 8.0(API 26) - 后台服务冻结

核心特性

后台服务限制:应用进入后台后,后台服务会在短时间内被冻结,需使用前台服务或 JobScheduler

StartForegroundService:启动前台服务时需在 5 秒内调用 startForeground(),否则触发 ANR。

代码示例

// 启动前台服务

startForegroundService(new Intent(this, MyForegroundService.class));

// 服务中创建通知

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL\_ID)

        .setContentTitle("Foreground Service")

        .setSmallIcon(R.drawable.ic\_notification);

startForeground(NOTIFICATION\_ID, builder.build());

九、Android 9.0(API 28) - 位置权限收紧

核心特性

位置权限限制:后台访问位置需申请 ACCESS_BACKGROUND_LOCATION 权限,且需开启 GPS。

后台位置访问:应用需在前台时获取位置信息,后台访问需明确用户授权。

适配建议

使用 FusedLocationProviderClient 替代传统位置 API。

避免在后台频繁获取位置数据。

十、Android 10(API 29) - 存储沙盒化

核心特性

Scoped Storage:应用默认只能访问自身目录,访问外部存储需通过 MediaStoreStorage Access Framework

后台服务限制:进一步收紧后台服务权限,推荐使用 WorkManager

代码示例

// 通过 MediaStore 查询图片

ContentResolver resolver = getContentResolver();

Uri collection = MediaStore.Images.Media.EXTERNAL\_CONTENT\_URI;

Cursor cursor = resolver.query(collection, null, null, null, null);

十一、Android 11(API 30) - 权限精细化

核心特性

一次性权限:用户可授予应用单次位置、相机或麦克风访问权限。

后台位置权限:申请后台位置需先获得前台位置权限,且用户需在设置中手动授权。

适配建议

使用 ActivityResultContracts 处理权限请求。

避免在后台长时间占用敏感权限。

十二、Android 12(API 31) - 隐私增强

核心特性

近似位置:用户可选择授予应用精确或近似位置权限。

麦克风 / 摄像头提示:应用使用麦克风或摄像头时,状态栏显示提示图标。

代码示例

// 申请位置权限

ActivityResultLauncher\<String\[]> locationRequest = registerForActivityResult(

&#x20;   new ActivityResultContracts.RequestMultiplePermissions(),

&#x20;   result -> {

&#x20;       if (result.getOrDefault(Manifest.permission.ACCESS\_FINE\_LOCATION, false)) {

&#x20;           // 有权限

&#x20;       }

&#x20;   }

);

locationRequest.launch(new String\[]{Manifest.permission.ACCESS\_FINE\_LOCATION});

十三、Android 13(API 33) - 后台服务管理

核心特性

沙盒限制:应用无法直接访问其他应用私有目录,需通过 ContentProvider 共享数据。

前台服务任务管理器:系统提供前台服务列表,用户可直接管理。

适配建议

使用 WorkManager 替代后台服务执行任务。

避免在后台执行高耗电操作。

十四、Android 14(API 34) - 前台服务类型

核心特性

前台服务类型:需在清单中声明服务类型(如 dataSynclocation),否则无法启动。

用户启动的数据传输:新增 WorkManager API,支持用户发起的长时间数据传输。

代码示例

\<!-- AndroidManifest.xml -->

\<service

&#x20;   android:name=".MyDataSyncService"

&#x20;   android:foregroundServiceType="dataSync" />

十五、Android 15(API 35) - 服务超时机制

核心特性

数据同步超时dataSync 前台服务在 24 小时内最多运行 6 小时,超时触发 onTimeout() 回调。

媒体处理服务:新增 mediaProcessing 服务类型,支持媒体文件转码等操作。

适配建议

实现 onTimeout() 方法,及时停止服务。

避免长时间占用 dataSync 服务。

十六、Android 16(API 36) - 服务管理优化

核心特性

后台服务优先级:系统根据应用使用频率动态调整后台服务优先级,优先保障前台应用。

服务监控:新增开发者工具,支持实时监控后台服务资源占用。

适配建议

使用 WorkManager 调度任务,避免直接启动后台服务。

优化服务代码,减少资源消耗。

总结:从 Android 1.0 到 Android 16 的 Service 演进

版本 核心特性 推荐替代方案
1.0 基础服务组件
2.0 IntentService 简化异步任务
3.0 多任务优化
4.0 绑定服务增强
5.0 JobScheduler 任务调度 替代 AlarmManager
6.0 Doze 模式省电 使用 JobScheduler
7.0 隐式广播限制 动态注册广播接收器
8.0 后台服务冻结 使用前台服务或 JobScheduler
9.0 位置权限收紧 FusedLocationProviderClient
10.0 Scoped Storage 沙盒化 MediaStore 或 Storage Access
11.0 一次性权限 ActivityResultContracts
12.0 近似位置
13.0 沙盒限制 ContentProvider
14.0 前台服务类型
15.0 服务超时机制
16.0 服务管理优化 WorkManager

最佳实践

优先使用 WorkManager:替代传统后台服务,自动处理任务调度和资源管理。

避免后台执行:尽可能将任务移至前台或使用 JobScheduler。

权限管理:动态申请敏感权限,尊重用户隐私选择。

优化代码:减少服务中的耗时操作,使用线程池或协程。

通过以上版本特性的分析,开发者可以更好地理解 Android Service 的演进历程,并根据不同版本的特性选择最优的实现方案。


网站公告

今日签到

点亮在社区的每一天
去签到