成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

IntentService的原理及應用

開發 前端
現在我們知道了,IntentService?的內部是通過消息的方式請求HandlerThread?執行任務,HandlerThread?內部又是一種使用Handler的Thread?,這就意味著IntentService和Looper一樣是順序執行后臺任務的。

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

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

IntentService使用

  1. 「創建 IntentService 子類」

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

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 中。

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方法。

@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方法會創建一個HandlerThread對象并調用它的start方法,利用這個HandlerThread的Looper創建ServiceHandler對象mServiceHandler,這樣通過mServiceHandler發送的消息最終都會在HandlerThread中執行。

每次啟動IntentService,它的onStartCommand方法都會調用一次。

@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方法中直接調用onStart方法,onStart方法只是把intent封裝進一個消息,并通過mServiceHandler發送出去。

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)方法嘗試停止服務,因為這個時候可能還有其他消息未處理,只有所有消息都處理完才會真的停止服務。

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

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2020-05-15 08:10:14

HTTP3應用協議

2010-10-09 16:40:52

2016-03-25 10:21:22

androidIntentServi代碼

2024-01-04 08:16:34

Spring國際化標準

2019-07-31 08:11:46

ACL訪問控制列表網絡通信

2024-10-15 13:30:03

2022-10-24 09:56:09

seleniumGrid分布式

2009-12-07 19:48:10

PHP單元素設計模式

2020-02-12 16:58:15

JavaScript前端技術

2021-06-09 09:08:10

LDOlowdropoutr穩壓器

2011-05-04 10:47:40

打印技術染料熱升華

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架構企業級應用

2011-05-07 17:06:21

熱升華打印機工作原理應用

2010-02-04 14:25:27

2022-03-17 08:55:43

本地線程變量共享全局變量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品日韩欧美 | 国产在线小视频 | 亚洲成av人片在线观看 | 久久久精品一区 | 免费人成在线观看网站 | 香蕉视频1024 | 91精品国产91久久久久久最新 | 一区二区三区中文字幕 | 国产一级一片免费播放 | 中文日韩字幕 | 午夜精品一区二区三区免费视频 | 日韩精品一区二区三区中文在线 | 一区在线播放 | 亚洲国产精品久久久久 | 亚洲色图综合 | 精品国产乱码久久久久久图片 | 国产在线观看一区二区 | 久草免费在线视频 | 日韩国产一区二区三区 | 干一干操一操 | 国产欧美日韩在线 | 成人永久免费视频 | www精品美女久久久tv | 亚洲成av人影片在线观看 | 青青久久久| 中文字幕成人免费视频 | 在线免费国产 | 国产成人影院 | 美国黄色毛片 | 久久精品中文字幕 | 国产精品永久免费视频 | 美女天天干天天操 | 亚洲国产精品自拍 | 三级成人在线 | 欧美a级成人淫片免费看 | 久久精品免费一区二区三 | 国产精品中文字幕在线播放 | 欧美一区二区三区在线观看 | 人妖无码 | 亚洲视频在线看 | 久久久久国产一区二区三区四区 |