Android四大元件之Service服務

2021-06-27 16:41:18 字數 3782 閱讀 5463

一、service簡介

service的啟動有兩種方式:context.startservice()context.bindservice()。

二、service服務的優點:

程序分為5個等級的優先順序:(從高到低)

1.foreground process 前台程序  使用者正在玩的應用程式對應的程序

2.visible process 可視程序 使用者仍然可以看到這個程序的介面。

3.service process服務程序  應用程式有乙個服務元件在後台執行。

4.background process 後台程序  應用程式沒有服務在執行 並且最小化 (activity onstop)

5.empty process 空程序 沒有任何執行的activity, 任務棧空了

由於服務的優先順序較高,所以當手機的可用記憶體不足時,系統會先清理空程序和後台程序,而不是清理服務程序,而且,即便由於手機記憶體嚴重不足而清理了服務程序,當手機記憶體重新變得充足時,系統又會重新啟動被清理掉的服務程序,從而保證了服務程序能夠持續執行,這就保證了像保護手機安全的服務程序能有效的執行。這些優點都是執行緒所無法做到的。

三、service服務的生命週期

這兩種啟動方式有其不同的生命週期:

1.採用start的方式開啟服務 

生命週期如下:

開啟服務: oncreate()--> onstartcommand()  ---> ondestory();

如果服務已經開啟,不會重複的執行oncreate(), 而是會呼叫onstart()和 onstartcommand();

服務停止的時候 ondestory()。服務只會被停止一次。

2.服務還有一種開啟方式,繫結的方式開啟服務。(不可以自己new服務,然後呼叫服務裡面的方法)

oncreate() --->onbind();--->onunbind()-->ondestory();

繫結服務不會呼叫onstart或者onstartcommand方法;

四、service服務的使用

本地服務部分:

由於啟動服務只需簡單的實現startservice()方法,所以這裡不在介紹這種方法,只是介紹通過繫結服務啟動服務的方法。

1.建立乙個服務類並繼承service,實現其未實現的方法,並在程序中寫入程序要執行的方法。

public class myservice extends service 

}

2.服務類建立好後,由於要將服務裡面的方法暴露出來,所以需要設定乙個中間人(建立服務與主activity的聯絡),然後通過中間人來呼叫方法。這裡先在服務類中建立乙個中間人(此處只是為了更好的理解,通常我們都是設定為mybinder)。

public class middleperson extends binder

/*** 陪領導打麻將

*/public void playmajiang()

}

3.將中間人返回給主activity。

public ibinder onbind(intent intent)
4.在服務中我們已經將中間人返回了,但問題是這個中間人會返回到**,主activity將在**能夠接收到這個中間人。此時,我們先不接收這個中間人,我們先將主activity與service繫結起來。

//繫結服務

public void bind(view view)

5.由第4步的**我們可以看見,繫結服務的操作我們需要乙個服務連線的類serviceconnection。此時我們需要建立乙個連線類,並作為引數傳入bindservice()方法,實現activity與service的連線。

private class myconn implements serviceconnection

//當服務失去連線時呼叫(並不是主動斷開連線時呼叫,一般為程序掛了,和服務被異常殺死時呼叫)

@override

public void onservicedisconnected(componentname name)

}

由上述**可以看見,第3步返回的中間人將在服務連線類中的onserviceconnected(componentname name, ibinder service)中的第二個引數ibinder返回。從這裡我們便可以獲取到中間人物件。

6.此時我們便可以再主acivity中呼叫服務裡面的方法。

//呼叫服務裡面的方法

public void call(view view)

繫結遠端服務部分:

繫結遠端服務其實與繫結本地服務類似,只是需要多使用乙個aidl:android inte***ce definition language  安卓介面定義語言。

遠端服務端:

1.建立服務類,設定服務裡面需要呼叫的方法,並設定中間人(服務與主activity的聯結器)。

/**

* 安全支付的方法

* @param time

* @param password

* @param money

*/private boolean pay(long time,string password,double money) else }

private class mybinder extends isafepay.stub

}

2.使用aidl語言定義乙個介面型別,可以先定義乙個介面,擴充套件mybinder裡面的方法,然後把該介面的字尾名改為aidl。由於aidl檔案都是公有的,沒有訪問許可權修飾符,所以我們需要把介面檔案中的許可權修飾符public都刪除掉。

package com.jinglion.alipay;

inte***ce isafepay

3.返回中間人物件。

@override

public ibinder onbind(intent intent)

呼叫服務端:

1.首先把遠端服務端aidl檔案複製過來,要求檔案內容,檔名和包名完全一致。

2.採用隱式意圖的方法與遠端服務端繫結。

intent intent = new intent();

intent.setaction("com.jinglion.alipay");

conn = new myconn();//服務連線類

//繫結服務,呼叫服務裡面的方法

bindservice(intent, conn, bind_auto_create);

3.建立遠端服務端,並實現其未實現的方法,從中獲取中間人物件。

public class myconn implements serviceconnection else 

// } catch (remoteexception e)

// unbindservice(conn);

// isafepay = null;

// conn = null;

} @override

public void onservicedisconnected(componentname name)

}}

4.通過中間人呼叫服務裡面的方法。

android 四大元件

1.activity 2.service 3.contentprovider 應用中的資料,對外進行共享,其它應用可以通過內容提供者,可以訪問到你應用中的資料,對資料進行增刪改查 1 對不同的資料格式,統一了檔案格式和資料訪問api 2 內容提供者要繼承contentprovider類 3 在清單檔...

Android 四大元件

activity intent receiver service content provider 並不是每乙個android應用程式都需要這四種構造塊,這不是必須的。當我們明確了我們的應用需要哪些構造塊後,我們就需要在androidmanifest.xml中登記這些構造塊的清單。這個配置檔案用於定...

android四大元件

android 四大元件 1.contentprovider contentprovider是什麼 android中的乙個應用元件 作為乙個引用元件的表現是生命週期方法 android中內容提供者 一般是內部儲存中的資料 contentprovider 物件的應用場合 例如 3.contentpri...