自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

IntentService的原理及應(yīng)用

開發(fā) 前端
現(xiàn)在我們知道了,IntentService?的內(nèi)部是通過消息的方式請求HandlerThread?執(zhí)行任務(wù),HandlerThread?內(nèi)部又是一種使用Handler的Thread?,這就意味著IntentService和Looper一樣是順序執(zhí)行后臺任務(wù)的。

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

與傳統(tǒng)的Service不同,IntentService默認不會在主線程中運行,可以避免因執(zhí)行耗時或可能被阻塞的操作而導(dǎo)致應(yīng)用程序被掛起或出現(xiàn)ANR錯誤。IntentService內(nèi)部創(chuàng)建了一個工作隊列(worker queue),一次只傳遞一個Intent到onHandleIntent方法中進行處理,簡化了多線程編程的復(fù)雜性。

IntentService使用

  1. 「創(chuàng)建 IntentService 子類」

創(chuàng)建一個繼承自 IntentService 的類,重寫 onHandleIntent 方法。onHandleIntent 方法會在一個單獨的工作線程中運行,用于處理你的后臺任務(wù)。

public class ChildIntentService extends IntentService {

    public ChildIntentService() {
        super("Reathin");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        //執(zhí)行耗時任務(wù)
        Log.d(TAG, "onHandleIntent:耗時任務(wù)開始");
        String serviceName = intent.getStringExtra("serviceName");
        if (TextUtils.equals(serviceName, "ChildIntentService")){
            simulationTask();
            Log.d(TAG, "onHandleIntent:耗時任務(wù)完成");
        }
    }

    /**
     * 模擬耗時任務(wù)
     */
    private void simulationTask() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy:服務(wù)自動停止");
    }
}
  1. 「啟動 IntentService」

通過創(chuàng)建一個 Intent 對象并調(diào)用 Context.startService(Intent) 方法來啟動 IntentService。你可以將需要傳遞給 IntentService 的數(shù)據(jù)放在 Intent 的 extras 中。

Intent intent = new Intent(MainActivity.this, ChildIntentService.class);
intent.putExtra("serviceName", "ChildIntentService");
startService(intent);
  1. 「停止 IntentService」通常不需要手動停止 IntentService,因為任務(wù)都處理完成后自動停止。如果確實需要立即停止,可以調(diào)用 stopSelf() 方法。注意,即使調(diào)用了 stopSelf(),onHandleIntent 方法中正在處理的任務(wù)仍然會完成。
  2. 「處理結(jié)果」IntentService 在一個后臺線程中運行,不能直接在 onHandleIntent 方法中更新 UI。如果需要將結(jié)果返回給 UI 線程,可以使用 Handler、BroadcastReceiver、LiveData、RxJava 等機制來實現(xiàn)。
2024-05-07 18:05:41.712 11300-11349 onHandleIntent:耗時任務(wù)開始
2024-05-07 18:05:46.713 11300-11349 onHandleIntent:耗時任務(wù)完成
2024-05-07 18:05:46.716 11300-11300 onDestroy:服務(wù)自動停止

IntentService原理

IntentService封裝了HandlerThread和Handler,當?shù)谝淮伪粏?,會調(diào)用它的onCreate方法。

@Override
public 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方法會創(chuàng)建一個HandlerThread對象并調(diào)用它的start方法,利用這個HandlerThread的Looper創(chuàng)建ServiceHandler對象mServiceHandler,這樣通過mServiceHandler發(fā)送的消息最終都會在HandlerThread中執(zhí)行。

每次啟動IntentService,它的onStartCommand方法都會調(diào)用一次。

@Override
public void onStart(@Nullable Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}

@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    onStart(intent, startId);
    return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}

onStartCommand方法中直接調(diào)用onStart方法,onStart方法只是把intent封裝進一個消息,并通過mServiceHandler發(fā)送出去。

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內(nèi)部很簡單,在收到消息之后會把消息傳遞給onHandleIntent方法處理,onHandleIntent方法需要我們在子類中實現(xiàn),它的作用是通過Intent區(qū)分具體任務(wù)并執(zhí)行這些任務(wù)。當onHandleIntent方法結(jié)束后會調(diào)用IntentService的stopSelf(int startId)方法嘗試停止服務(wù),因為這個時候可能還有其他消息未處理,只有所有消息都處理完才會真的停止服務(wù)。

現(xiàn)在我們知道了,IntentService的內(nèi)部是通過消息的方式請求HandlerThread執(zhí)行任務(wù),HandlerThread內(nèi)部又是一種使用Handler的Thread,這就意味著IntentService和Looper一樣是順序執(zhí)行后臺任務(wù)的。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關(guān)推薦

2020-05-15 08:10:14

HTTP3應(yīng)用協(xié)議

2016-03-25 10:21:22

androidIntentServi代碼

2010-10-09 16:40:52

2024-01-04 08:16:34

Spring國際化標準

2024-10-15 13:30:03

2019-07-31 08:11:46

ACL訪問控制列表網(wǎng)絡(luò)通信

2022-10-24 09:56:09

seleniumGrid分布式

2020-02-12 16:58:15

JavaScript前端技術(shù)

2009-12-07 19:48:10

PHP單元素設(shè)計模式

2011-05-04 10:47:40

打印技術(shù)染料熱升華

2021-06-09 09:08:10

LDOlowdropoutr穩(wěn)壓器

2017-03-17 19:59:39

2023-03-05 16:36:14

Linux鏈接目標文件

2010-04-27 09:55:15

2010-08-17 10:42:37

NAT路由器

2009-07-29 16:04:39

ASP.NET1.1驗

2009-08-25 13:48:01

Java EE架構(gòu)企業(yè)級應(yīng)用

2011-05-07 17:06:21

熱升華打印機工作原理應(yīng)用

2010-02-04 14:25:27

2009-07-06 09:23:51

Servlet定義
點贊
收藏

51CTO技術(shù)棧公眾號