天天看點

服務

1. 服務的概念

*服務運作于背景,其存在于所屬應用的程序。當所屬應用的程序被殺死,則服務也被殺死。

*服務并不會主動開啟新線程執行任務,服務的所有代碼都是預設由主線程執行。

*為了不阻塞主線程,服務中的具體任務需要手動建立子線程來執行。

2. 異步消息處理機制

異步消息處理機制需要使用的元件包括:message對象、handler對象(主線程和子線程共用一個對象)、messagequeue對象(一個線程

有唯一一個,自動建立)、looper((一個線程有唯一一個,自動建立)。

步驟:

在主線程建立handler對象,在子線程中建立message對象,并給message設定一些參數(what作為id、obj屬性存對象等);

在子線程中根據業務需要調用handler對象的sendmessage()方法,将message對象存入到主線程的messagequeue對象中;

主線程的looper對象将messagequeue對象取出并調用handler對象的handlemessage()方法處理message對象。

3. 異步消息處理抽象類asynctask

<code>/**</code>

<code>* &lt;params, progress, result&gt;</code>

<code>* params: 建立目前異步任務時需要傳入的參數,一般為void</code>

<code>* progress: 更新異步任務進度時,需要調用publishprogress(progress)方法,progress就是參數類型</code>

<code>* result:異步任務的傳回參數類型</code>

<code>* * */</code>

<code>class myasynctask extends asynctask&lt;void,integer,boolean&gt; {</code>

<code>@override protected void onpreexecute() {</code>

<code>super.onpreexecute();</code>

4. 服務的建立、啟動和停止

`public class mainactivity extends appcompatactivity implements view.onclicklistener {

private button startbtn, stopbtn, bindbtn,unbindbtn;

private string tag = "主活動";

private serviceconnection serviceconnection = new serviceconnection() {

@override

public void onserviceconnected(componentname name, ibinder service) {

log.d(tag,"綁定");

((myservice.mybinder)service).startdownload();

((myservice.mybinder)service).getprogress();

}`

+++++++++++++++++++++++++++++++

public class myservice extends service {

private string tag = "你的服務";

}

5. intentservice

業務邏輯寫進intentservice的onhandleintent()方法中,這個方法會被自動新開的子線程執行。當方法執行完畢,子線程會自動執行銷毀方法将intentservice對象關閉。