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

IntentService的原理及应用

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

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

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

IntentService使用

  1. 「创建 IntentService 子类」

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

每次启动IntentService,它的onStartCommand方法都会调用一次。YHh28资讯网——每日最新资讯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发送出去。YHh28资讯网——每日最新资讯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)方法尝试停止服务,因为这个时候可能还有其他消息未处理,只有所有消息都处理完才会真的停止服务。YHh28资讯网——每日最新资讯28at.com

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

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

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

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

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

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 余承东:AI大模型技术的发展将会带来下一代智能终端操作系统的智慧体验

    8月4日消息,2023年华为开发者大会(HDC.Together)今天正式开幕,华为发布HarmonyOS 4、全新升级的鸿蒙开发套件、HarmonyOS Next开发者预览版本等一系列
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top