当前位置:首页 > 科技  > 软件

IntentService的原理及应用

来源: 责编: 时间:2024-05-09 09:24:53 231观看
导读IntentService是Android中Service的一个子类,一般用于执行后台耗时任务和处理异步请求。通过startService(Intent)方法传递请求给IntentService时,IntentService会在一个新的工作线程(worker thread)中处理每个Intent对象

IntentService是Android中Service的一个子类,一般用于执行后台耗时任务和处理异步请求。通过startService(Intent)方法传递请求给IntentService时,IntentService会在一个新的工作线程(worker thread)中处理每个Intent对象。当所有的工作任务都执行完毕,IntentService会自动停止。PrQ28资讯网——每日最新资讯28at.com

与传统的Service不同,IntentService默认不会在主线程中运行,可以避免因执行耗时或可能被阻塞的操作而导致应用程序被挂起或出现ANR错误。IntentService内部创建了一个工作队列(worker queue),一次只传递一个Intent到onHandleIntent方法中进行处理,简化了多线程编程的复杂性。PrQ28资讯网——每日最新资讯28at.com

IntentService使用

  1. 「创建 IntentService 子类」

创建一个继承自 IntentService 的类,重写 onHandleIntent 方法。onHandleIntent 方法会在一个单独的工作线程中运行,用于处理你的后台任务。PrQ28资讯网——每日最新资讯28at.com

public class ChildIntentService extends IntentService {    public ChildIntentService() {        super("Reathin");    }    @Override    protected void onHandleIntent(@Nullable Intent intent) {        //执行耗时任务        Log.d(TAG, "onHandleIntent:耗时任务开始");        String serviceName = intent.getStringExtra("serviceName");        if (TextUtils.equals(serviceName, "ChildIntentService")){            simulationTask();            Log.d(TAG, "onHandleIntent:耗时任务完成");        }    }    /**     * 模拟耗时任务     */    private void simulationTask() {        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    @Override    public void onDestroy() {        super.onDestroy();        Log.d(TAG, "onDestroy:服务自动停止");    }}
  1. 「启动 IntentService」

通过创建一个 Intent 对象并调用 Context.startService(Intent) 方法来启动 IntentService。你可以将需要传递给 IntentService 的数据放在 Intent 的 extras 中。PrQ28资讯网——每日最新资讯28at.com

Intent intent = new Intent(MainActivity.this, ChildIntentService.class);intent.putExtra("serviceName", "ChildIntentService");startService(intent);
  1. 「停止 IntentService」通常不需要手动停止 IntentService,因为任务都处理完成后自动停止。如果确实需要立即停止,可以调用 stopSelf() 方法。注意,即使调用了 stopSelf(),onHandleIntent 方法中正在处理的任务仍然会完成。
  2. 「处理结果」IntentService 在一个后台线程中运行,不能直接在 onHandleIntent 方法中更新 UI。如果需要将结果返回给 UI 线程,可以使用 Handler、BroadcastReceiver、LiveData、RxJava 等机制来实现。
2024-05-07 18:05:41.712 11300-11349 onHandleIntent:耗时任务开始2024-05-07 18:05:46.713 11300-11349 onHandleIntent:耗时任务完成2024-05-07 18:05:46.716 11300-11300 onDestroy:服务自动停止

IntentService原理

IntentService封装了HandlerThread和Handler,当第一次被启动,会调用它的onCreate方法。PrQ28资讯网——每日最新资讯28at.com

@Overridepublic void onCreate() {    // TODO: It would be nice to have an option to hold a partial wakelock    // during processing, and to have a static startService(Context, Intent)    // method that would launch the service & hand off a wakelock.    super.onCreate();    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");    thread.start();    mServiceLooper = thread.getLooper();    mServiceHandler = new ServiceHandler(mServiceLooper);}

onCreate方法会创建一个HandlerThread对象并调用它的start方法,利用这个HandlerThread的Looper创建ServiceHandler对象mServiceHandler,这样通过mServiceHandler发送的消息最终都会在HandlerThread中执行。PrQ28资讯网——每日最新资讯28at.com

每次启动IntentService,它的onStartCommand方法都会调用一次。PrQ28资讯网——每日最新资讯28at.com

@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;}

onStartCommand方法中直接调用onStart方法,onStart方法只是把intent封装进一个消息,并通过mServiceHandler发送出去。PrQ28资讯网——每日最新资讯28at.com

private final class ServiceHandler extends Handler {    public ServiceHandler(Looper looper) {        super(looper);    }    @Override    public void handleMessage(Message msg) {        onHandleIntent((Intent)msg.obj);        stopSelf(msg.arg1);    }}

ServiceHandler内部很简单,在收到消息之后会把消息传递给onHandleIntent方法处理,onHandleIntent方法需要我们在子类中实现,它的作用是通过Intent区分具体任务并执行这些任务。当onHandleIntent方法结束后会调用IntentService的stopSelf(int startId)方法尝试停止服务,因为这个时候可能还有其他消息未处理,只有所有消息都处理完才会真的停止服务。PrQ28资讯网——每日最新资讯28at.com

现在我们知道了,IntentService的内部是通过消息的方式请求HandlerThread执行任务,HandlerThread内部又是一种使用Handler的Thread,这就意味着IntentService和Looper一样是顺序执行后台任务的。PrQ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87486-0.htmlIntentService的原理及应用

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 新手必看:Python中的字符串格式化入门指南

下一篇: 工作中最常见的6种OOM(内存溢出)问题,你知道几个?

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了“本地生活”入口,位置较深,位于首页的“充值中心”内,目前主要售卖美食相关的
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top