Android Service 从 1.0 到 16 的演进史

一、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.0IntentService 简化异步任务
3.0多任务优化
4.0绑定服务增强
5.0JobScheduler 任务调度替代 AlarmManager
6.0Doze 模式省电使用 JobScheduler
7.0隐式广播限制动态注册广播接收器
8.0后台服务冻结使用前台服务或 JobScheduler
9.0位置权限收紧FusedLocationProviderClient
10.0Scoped Storage 沙盒化MediaStore 或 Storage Access
11.0一次性权限ActivityResultContracts
12.0近似位置
13.0沙盒限制ContentProvider
14.0前台服务类型
15.0服务超时机制
16.0服务管理优化WorkManager

最佳实践

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值