AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

IntentService的原理及應用

來源: 責編: 時間:2024-05-09 09:24:53 118觀看
導讀IntentService是Android中Service的一個子類,一般用于執行后臺耗時任務和處理異步請求。通過startService(Intent)方法傳遞請求給IntentService時,IntentService會在一個新的工作線程(worker thread)中處理每個Intent對象

IntentService是Android中Service的一個子類,一般用于執行后臺耗時任務和處理異步請求。通過startService(Intent)方法傳遞請求給IntentService時,IntentService會在一個新的工作線程(worker thread)中處理每個Intent對象。當所有的工作任務都執行完畢,IntentService會自動停止。uDl28資訊網——每日最新資訊28at.com

與傳統的Service不同,IntentService默認不會在主線程中運行,可以避免因執行耗時或可能被阻塞的操作而導致應用程序被掛起或出現ANR錯誤。IntentService內部創建了一個工作隊列(worker queue),一次只傳遞一個Intent到onHandleIntent方法中進行處理,簡化了多線程編程的復雜性。uDl28資訊網——每日最新資訊28at.com

IntentService使用

  1. 「創建 IntentService 子類」

創建一個繼承自 IntentService 的類,重寫 onHandleIntent 方法。onHandleIntent 方法會在一個單獨的工作線程中運行,用于處理你的后臺任務。uDl28資訊網——每日最新資訊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 中。uDl28資訊網——每日最新資訊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方法。uDl28資訊網——每日最新資訊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中執行。uDl28資訊網——每日最新資訊28at.com

每次啟動IntentService,它的onStartCommand方法都會調用一次。uDl28資訊網——每日最新資訊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發送出去。uDl28資訊網——每日最新資訊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)方法嘗試停止服務,因為這個時候可能還有其他消息未處理,只有所有消息都處理完才會真的停止服務。uDl28資訊網——每日最新資訊28at.com

現在我們知道了,IntentService的內部是通過消息的方式請求HandlerThread執行任務,HandlerThread內部又是一種使用Handler的Thread,這就意味著IntentService和Looper一樣是順序執行后臺任務的。uDl28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-87486-0.htmlIntentService的原理及應用

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

下一篇: 工作中最常見的6種OOM(內存溢出)問題,你知道幾個?

標簽:
  • 熱門焦點
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛。現在,我們就開始今
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、“Ringdoll戒之人形”淘寶店鋪有關外貌的評價,黃山已經聽累了。生于1985年的他,哪
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
Top