Android:IntentService的學習

Android的四大組件中,Service排行老二,在Android中的主要作用是后臺服務,進行與界面無關的操作。由于Service運行在主線程,所以進行異步操作需要在子線進行。為此Android為我們提供了IntentServiceIntentService是一個抽象類,繼承至Service,主要方便我們新建工作線程進行異步操作。提交任務到IntentService時,異步任務以串行方式進行處理,意味著工作線程一次只處理一個任務。而且當所有任務都完成之后,會自動停止Service,不需要我們手動停止。

IntentService 的使用

  1. 我們定義DownloadService類并繼承至IntentService。來模擬網絡下載的過程。
public class DownloadService extends IntentService {private static int count = 0;/*** 主要用于調用服務類構造器** @param name 用于區分不同任務*/public DownloadService(String name) {super(name);}/*** AndroidManifest.xml配置清單需要配置** @param*/public DownloadService() {super("action");}/***主要重寫該方法,在該方法內進行異步操作。**/@Overrideprotected void onHandleIntent(Intent intent) {Log.i("Download", "onHandleIntent" + count);count++;String name = intent.getStringExtra("action");if (name.equals("download")) {for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();return;}Log.i("Download", "download:" + count);}}}//以下方法的重寫,僅僅為了打印日志@Overridepublic void onDestroy() {super.onDestroy();Log.i("Download", "onDestroy");}@Overridepublic void onCreate() {super.onCreate();Log.i("Download", "onCreate");}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);Log.i("Download", "onStart");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("Download", "onStartCommand");return super.onStartCommand(intent, flags, startId);}
}復制代碼
  1. 在AndroidManifest.xml配置DownloadService
<service android:name=".DownloadService"/>
復制代碼
  1. 在MainActivity類中循環調用Service,啟動多循環任務。
 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent=new Intent(this,DownloadService.class);for (int i =0;i<3;i++){intent.putExtra("action","download");intent.putExtra("count",""+i);startService(intent);}}
復制代碼
  1. 運行結果

分析: 從運行結果知道,IntentService在運行多個任務情況下,只調用一次onCreate,調用多次onStartCommand,跟Service的生命周期一致。但,只有在運行完download:1之后才會去運行download:2,接著是download:3。最后所有任務結束后會自動調用onDestroy,停止服務。在這里需要注意的是,和Service并不同,Service需要我們手動停止服務。對于結果的回調,可以采用接口回調,廣播,EventBus

那么,IntentService是如何在Service中實現異步操作和串行處理任務的呢?

IntentService內部實現

  1. 查看IntentService的onCreate方法
 @Overridepublic void onCreate() {super.onCreate();//分析一HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();分析二mServiceHandler = new ServiceHandler(mServiceLooper);}
復制代碼

分析一

HandThread繼承Thread,通過start方法創建工作線程,內部建立Looper來達到消息循環,通過Hanlder消息機制來達到串行的效果和處理多任務。HandThreadHandler消息機制,可以另外查看文章。

分析二

ServiceHandler繼承Handler,與普通的Handler并沒有區別,在其內容處理handleMessage。即調用IntentServiceonHandleIntent

  private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}}
復制代碼
  1. 那么,當我們在Activity中重復調用startService方法時,只會多次調用onStartCommand方法,并不會重復調用onCreate方法。我們看看onStartComamnd方法的實現。
    @Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}
復制代碼

可以看得出,調用了onStart方法了。而onStart方法只是將我們的Intent包裝成Message,通過Handler發送出去,并在Handler中進行處理,調用我們的onHandleIntent。進而調用我們實現onHandleIntent的代碼。

    @Overridepublic void onStart(@Nullable Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);}
復制代碼

總結

IntentService并沒有什么的新的技術含量,在了解HandlerTread和Handler的消息機制下,對Handler+Thread+Service作一個封裝,更適合我們后臺進行異步耗時操作的場景。有效避免通過new多個Thread

知識點分享

Android消息機制

HandlerThread必知必會

如果覺得文章有用,給文章點個贊,鐵子

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387652.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387652.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387652.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能商業大會構造信息化交流平臺

在快速發展的當今社會&#xff0c;所有事物都在日新月異地變化著&#xff0c;相較于過去的傳統商業的變化速度&#xff0c;現今基于數據的互聯網商業變化速度高出了一個量級&#xff0c;同時市場對于企業的應對速度也有了更高的要求&#xff0c;然而面對大體量的數據&#xff0…

itcast-ssh-crm實踐

分析 BaseDao 文件上傳 轉載于:https://www.cnblogs.com/hellowq/p/10209761.html

分類器大牛們

David Lowe&#xff1a;Sift算法的發明者&#xff0c;天才。 Rob Hess&#xff1a;sift的源碼OpenSift的作者&#xff0c;個人主頁上有openSift的下載鏈接&#xff0c;Opencv中sift的實現&#xff0c;也是參考這個。 Koen van de Sande&#xff1a;作者給出了sift,densesift,co…

go 成長路上的坑(1)

一、先來看一段代碼 package mainimport "fmt"type X struct{}func (x *X) test(){println("h1",x) } func main(){a : X{} a.test()(&X{}).test()(X{}).test() } 猜猜他的結果 二、揭曉答案 package mainimport "fmt"type X struct{}func (…

利用python腳本程序監控文件被修改

需求&#xff1a;利用python編寫監控程序&#xff0c;監控一個文件目錄&#xff0c;當目錄下的文件發生改變時&#xff0c;實現有修改就發報警郵件 郵件使用QQ郵箱&#xff0c;需要開啟smtp&#xff0c;使用手機發生短信&#xff0c;騰訊會給你發郵箱密碼。如下所示&#xff1a…

Oracle RAC

環境如下&#xff1a; Linux操作系統&#xff1a;Centos 6.5 64bit &#xff08;這個版本的redhat 6內核等OS在安裝grid最后執行root.sh時會出現crs-4124&#xff0c;是oracle11.2.0.1的bug&#xff09; VMware version&#xff1a;Workstation 8.0.3 build-703057 Oracle…

好程序員web前端分享MVVM框架Vue實現原理

好程序員web前端分享MVVM框架Vue實現原理&#xff0c;Vue.js是當下很火的一個JavaScript MVVM庫&#xff0c;它是以數據驅動和組件化的思想構建的。相比于Angular.js和react.js更加簡潔、更易于理解的API&#xff0c;使得我們能夠快速地上手并使用Vue.js。?1.什么是MVVM呢&…

HDU - 3516 Tree Construction

HDU - 3516 思路&#xff1a; 平行四邊形不等式優化dp &#xff1a;&#xff09; 代碼&#xff1a; #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc.h> using namespace std; #define y1 y11 #define fi first #define se…

各類總線傳輸速率

1. USB總線 USB1.1&#xff1a; -------低速模式(low speed)&#xff1a;1.5Mbps -------全速模式(full speed)&#xff1a; 12Mbps USB2.0&#xff1a;向下兼容。增加了高速模式&#xff0c;最大速率480Mbps。 -------高速模式(high speed)&#xff1a; 25~480Mbps US…

Activiti多人會簽例子

Activiti中提供了多實例任務&#xff08;for-each&#xff09;將多實例應到到UserTask中可以實現會簽功能。 Multi-instance (for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming …

Django 【認證系統】auth

本篇內容 介紹Django框架提供的auth 認證系統 方法&#xff1a; 方法名 備注 create_user 創建用戶 authenticate 登錄驗證 login 記錄登錄狀態 logout 退出用戶登錄 is_authenticated 判斷用戶是否登錄 login_required裝飾器 進行登錄判斷 引入模塊 from django.…

兒科常見疾病的中成藥療法

孩子感冒&#xff0c;分清寒熱是關鍵——兒童風寒感冒和風熱感冒的中成藥內服外治法 兒童不養兒不知父母恩&#xff0c;每個人恐怕都只有自己做了父母&#xff0c;才能感受到父母的愛。嬰幼兒正處于最初的發育期&#xff0c;抵抗力弱&#xff0c;有個感冒發燒的也是常有的事兒。…

物化視圖

有個項目因為有比較多的查詢匯總&#xff0c;考慮到速度&#xff0c;所以使用了物化視圖。簡單的把用到的給整理了下。先看簡單創建語句&#xff1a;create materialized view mv_materialized_test refresh force on demand start with sysdate nextto_date(concat(to_char( s…

為什么直接ping知乎的ip不能訪問知乎的網站,而百度就可以?

結論&#xff1a; 簡單的說&#xff0c;就是baidu有錢。 正文&#xff1a; 大型網站依靠自身稀稀落落的服務器很難滿足網頁“秒開”的用戶需求&#xff0c;會加入CDN加速的隊伍。 當用戶訪問 http://www.zhihu.com 時&#xff0c;域名解析到距離用戶最近的CDN服務器的公網IP&am…

皮膚病

小偏方治百病/《國醫絕學健康館》編委會編.—重慶&#xff1a;重慶出版社&#xff0c;2010.3&#xff08;國醫絕學健康館&#xff09; 濕疹 苦參湯熏洗治陰囊濕疹方 苦參、蛇麻子中藥各50克&#xff0c;混合后&#xff0c;在晚上煎湯&#xff0c;可直接放在臉盆中煎。煎好后&am…

MySQL-ProxySQL中間件(一)| ProxySQL基本概念

目錄 MySQL-ProxySQL中間件&#xff08;一&#xff09;| ProxySQL基本概念&#xff1a; https://www.cnblogs.com/SQLServer2012/p/10972593.htmlMySQL-ProxySQL中間件&#xff08;二&#xff09;| Admin Schemas介紹&#xff1a;https://www.cnblogs.com/SQLServer2012/p/109…

01 ftp上傳簡單示例服務端

import json import socket import structserver socket.socket() server.bind((127.0.0.1,8001)) server.listen() conn,addr server.accept()#首先接收文件的描述信息的長度 struct_data_len conn.recv(4) data_len struct.unpack(i,struct_data_len)[0]# 通過文件信息的…

標簽td設置隱藏(hidden)

這樣設置這個td就不會被其他的td給擠掉了! 還有一種方法就是把tr標簽的solid設置為0px 這個方法把td標簽的left,right,bottom,top的邊框的solid全部設置為0px;轉載于:https://www.cnblogs.com/tranquilityMan/p/10972811.html

Windows Server 2008 NFS

打開Windows Server 2008的Dos運行窗口&#xff08;不是powershell&#xff09;&#xff0c;然后鍵入&#xff1a; servermanagercmd.exe -install FS-NFS-Services 安裝完畢之后&#xff0c;就要把NFS的存貯映射到Windows Server 2008上某個盤符以供使用&#xff0c;但為了…

金融反欺詐模型----項目實戰--機器學習

機器學習&#xff1a;從源數據清洗到特征工程建立談金融反欺詐模型訓練 本文旨在通過一個完整的實戰例子&#xff0c;演示從源數據清洗到特征工程建立&#xff0c;再到模型訓練&#xff0c;以及模型驗證和評估的一個機器學習的完整流程。由于初識機器學習&#xff0c;會比較多的…