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

IntentService的原理及应用

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

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

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

IntentService使用

  1. 「创建 IntentService 子类」

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top