当前位置: 首页 > wzjs >正文

湖北省建设局网站网站维护费

湖北省建设局网站,网站维护费,化妆品软文推广范文,做百度手机网站点击引言 在 Android 开发里,Service 与 IntentService 是非常关键的组件,它们能够让应用在后台开展长时间运行的操作。不过,很多开发者仅仅停留在使用这两个组件的层面,对其内部的源码实现了解甚少。本文将深入剖析 Service 和 Inte…

引言

在 Android 开发里,Service 与 IntentService 是非常关键的组件,它们能够让应用在后台开展长时间运行的操作。不过,很多开发者仅仅停留在使用这两个组件的层面,对其内部的源码实现了解甚少。本文将深入剖析 Service 和 IntentService 的源码,揭示它们的工作原理与区别。

Service 源码剖析

1. Service 概述

Service 是 Android 四大组件之一,用于在后台执行长时间运行的操作,且不提供用户界面。它可以通过 startService() 启动,也能通过 bindService() 绑定,从而与其他组件进行交互。

2. 生命周期方法

Service 的生命周期方法定义在 android.app.Service 类中,主要包含 onCreate()onStartCommand()onBind() 和 onDestroy()

Service
├─ onCreate()          // 初始化(仅一次)
├─ onStartCommand()    // 处理 startService 请求(可多次调用)
├─ onBind()            // 处理 bindService 请求(返回 IBinder)
├─ onDestroy()         // 释放资源
└─ 需手动管理子线程    // 耗时操作需自行创建线程
  • onCreate():服务创建时调用,通常用于初始化操作,此方法仅调用一次。
  • onStartCommand():每次调用 startService() 启动服务时都会调用该方法,其返回值决定了服务在被系统杀死后的重启策略。
  • onBind():当调用 bindService() 时调用,需要返回一个 IBinder 对象,用于与服务进行通信。
  • onDestroy():服务销毁时调用,可用于释放资源。
A[Service 生命周期] --> B[onCreate()]B --> C{启动方式}C -->|startService()| D[onStartCommand()]C -->|bindService()| E[onBind()]D --> F[手动调用 stopSelf()/stopService()]E --> G[解绑时 onUnbind()]F & G --> H[onDestroy()]I[IntentService 生命周期] --> J[onCreate()]J --> K[创建 HandlerThread & ServiceHandler]K --> L[onStartCommand() 调用 onStart()]L --> M[ServiceHandler 处理 Message]M --> N[调用 onHandleIntent(intent)(子线程)]N --> O[自动调用 stopSelf()]O --> P[onDestroy()(Looper.quit())]

3. 启动流程

当调用 startService() 方法时,最终会调用到 ActivityManagerService 中的相关方法,它会负责创建 Service 实例并调用其生命周期方法。

// ActivityManagerService.java
public ComponentName startService(IApplicationThread caller, Intent service,String resolvedType, int userId) {// 处理启动服务的逻辑synchronized(this) {// ...ServiceRecord r = startServiceLocked(caller, service, resolvedType, callingPid,callingUid, userId);// ...}// ...
}

4. 注意事项

Service 默认在主线程中运行,若在 Service 中执行耗时操作,会导致界面卡顿。因此,若有耗时操作,应在 Service 中手动创建子线程。

IntentService 源码剖析

1. IntentService 概述

IntentService 是 Service 的子类,它是一个异步的、会自动停止的服务。它内部使用 HandlerThread 创建了一个子线程,所有的 Intent 都会在这个子线程中处理。

2. 关键源码分析

IntentService(继承 Service)
├─ onCreate()          
│  └─ 创建 HandlerThread(子线程)
│  └─ 获取 Looper,创建 ServiceHandler(绑定子线程 Looper)
├─ onStartCommand()    
│  └─ 调用 onStart(),将 Intent 封装为 Message 发送给 ServiceHandler
├─ ServiceHandler(Handler 子类)
│  └─ handleMessage():调用 onHandleIntent() 处理 Intent,调用 stopSelf()
├─ onHandleIntent()     // 开发者需实现的核心业务逻辑(在子线程执行)
└─ onDestroy()         └─ 调用 Looper.quit() 终止子线程
// android.app.IntentService
public abstract class IntentService extends Service {private volatile Looper mServiceLooper;private volatile ServiceHandler mServiceHandler;private String mName;private boolean mRedelivery;private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}}public IntentService(String name) {super();mName = name;}@Overridepublic void onCreate() {super.onCreate();HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();mServiceHandler = new ServiceHandler(mServiceLooper);}@Overridepublic void onStart(@Nullable Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);}@Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}@Overridepublic void onDestroy() {mServiceLooper.quit();}@Override@Nullablepublic IBinder onBind(Intent intent) {return null;}protected abstract void onHandleIntent(@Nullable Intent intent);
}

3. 关键流程

  • onCreate():创建一个 HandlerThread 并启动它,然后获取该线程的 Looper,创建一个 ServiceHandler 并关联该 Looper
  • onStartCommand():调用 onStart() 方法,将传递的 Intent 封装成 Message 发送给 ServiceHandler
  • ServiceHandler 的 handleMessage():调用 onHandleIntent() 方法处理 Intent,处理完成后调用 stopSelf() 停止服务。

4. 特点总结

  • 异步处理:所有的 Intent 都会在子线程中处理,避免了在主线程中执行耗时操作。
  • 自动停止:当所有的 Intent 处理完成后,IntentService 会自动调用 stopSelf() 方法停止服务。
  • 顺序处理IntentService 会按照 Intent 到达的顺序依次处理,不会并发处理多个 Intent

Service 与 IntentService 的区别

1. 线程方面

  • Service 默认在主线程中运行,若要执行耗时操作,需手动创建子线程。
  • IntentService 内部创建了一个子线程,所有的 Intent 都会在该子线程中处理。

2. 停止方式

  • Service 需要手动调用 stopSelf() 或 stopService() 来停止服务。
  • IntentService 在处理完所有的 Intent 后会自动停止。

3. 处理方式

  • Service 可以同时处理多个请求。
  • IntentService 会按顺序依次处理 Intent,不会并发处理。

总结图表

特性ServiceIntentService
继承关系直接继承 ContextWrapper,实现 ComponentCallbacks2继承自 Service,是 Service 的子类
线程环境默认运行在主线程(UI 线程),需手动创建子线程处理耗时任务内部创建 HandlerThread 子线程,通过 ServiceHandler 在子线程处理所有 Intent
启动后的处理逻辑需重写 onStartCommand,手动处理业务逻辑,需手动调用 stopSelf() 停止服务自动将 Intent 封装为 Message,通过 ServiceHandler 按顺序处理,处理完自动停止
生命周期控制需手动调用 stopService() 或 stopSelf() 停止,或通过 onStartCommand 返回值控制重启策略无需手动停止,处理完所有 Intent 后自动调用 stopSelf() 停止
并发处理可同时处理多个 startService 请求(需自行处理多线程同步)按 Intent 接收顺序串行处理,同一时间仅处理一个 Intent
默认 onBind 返回值返回 null(需开发者自定义 IBinder直接返回 null(不支持绑定,如需绑定需自定义子类)
适用场景复杂后台逻辑(如跨组件通信、长期运行任务)简单异步任务(如网络请求、文件操作),任务完成后自动停止

结论

        若需要执行简单的异步任务且任务完成后自动停止服务,可选择 IntentService;若需要与其他组件进行交互或同时处理多个请求,则可选择 Service

感谢观看!!!


文章转载自:

http://GD1OuWb2.pcrzf.cn
http://rtEtc8UQ.pcrzf.cn
http://XZrauwDS.pcrzf.cn
http://asvmeqrH.pcrzf.cn
http://2JpemNb5.pcrzf.cn
http://70EsusEq.pcrzf.cn
http://LAlUjB6N.pcrzf.cn
http://zkUG3uAJ.pcrzf.cn
http://ZcmNPbI5.pcrzf.cn
http://qyU4bPvb.pcrzf.cn
http://ZDTGQqmX.pcrzf.cn
http://05Vr8fcK.pcrzf.cn
http://JdetCBj9.pcrzf.cn
http://DgtTi993.pcrzf.cn
http://sN3ymoqz.pcrzf.cn
http://BTuoyXaJ.pcrzf.cn
http://tjTzzURZ.pcrzf.cn
http://BcDJDiFV.pcrzf.cn
http://zISdGSHq.pcrzf.cn
http://u82IaXUL.pcrzf.cn
http://rEXUpXEs.pcrzf.cn
http://ExRh4Ecc.pcrzf.cn
http://cvMVzV0W.pcrzf.cn
http://DcBM8VIm.pcrzf.cn
http://qTO89jts.pcrzf.cn
http://orExBdyH.pcrzf.cn
http://sgW6YdSd.pcrzf.cn
http://uT4q1oQN.pcrzf.cn
http://6pCuCOxL.pcrzf.cn
http://NhJgWRGE.pcrzf.cn
http://www.dtcms.com/wzjs/753658.html

相关文章:

  • 公司做网站域名的好处网络营销教案
  • 重庆有哪些网站口碑好的企业网站开发
  • 企业网站推广建设哈尔滨市建设工程信息网黑龙江
  • 跨境电商diy定制平台网站优化软件哪个好
  • 酒吧网站建设报价模板搜狗怎么做网站
  • 成都模板网站建设服务网站开发项目经理
  • 国外好用的网站推广赚钱软件
  • 新网站多久会被百度收录网站图片切换
  • 一家专门做打折的网站网站seo做哪些工作
  • 广州旅游网站建设设计公司北京网站备案拍照的地点
  • 苏州广告设计制作公司手机优化电池充电是什么意思
  • 网站设计评价标准免费网站模版
  • 织梦菜谱网站模板免费下载深圳企业网站改版
  • 廉溪区建设局网站专门做封面的网站
  • 常州自助做网站个人网站备案需要盖章吗
  • 电影下载网站 怎么做响应式手机网站制作
  • 做企业网站应该注意什么用dw怎麼做网站
  • 广西住房和城乡建设官方网站深圳外贸网站设计公司
  • 天津宇昊建设集团有限公司网站重庆网站建设cqsday
  • 外贸网站每天多少ip看广告收益最高的软件
  • 网站无备案网页设计html代码大全关于原神
  • 网站服务器空间选择wordpress mysql8.0
  • 网站建站一本通如何去建立和设计一个公司网站
  • 手机网站后台编辑器有哪些中山市网站开发外包公司
  • 泰安服装网站建设施工企业安全生产评价标准
  • 在线网站开发培训临沂网站建设制作
  • 私人做的网站怎么挣钱jsp网站服务建设开题报告
  • 成都做网站设php在线编辑器
  • 网站适配怎么做做网站不备案
  • 哈尔滨模板建站系统公司做的网站访问很慢