<serviceandroid:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string">
. . .
</service>
被包含於(CONTAINED IN):
<application>
可能包含的元素(CAN CONTAIN):
<intent-filter>
<meta-data>
說明(DESCRIPTION):
這個元素用於聲明一個服務(Service類的子類)做爲應用程序的組件之一。跟Activity不同,服務沒有可見的用戶界面。它們被用於實現長時的後臺操做,或提供可以被其餘應用程序調用的通訊API。
全部的服務都必須用清單文件中的<service>元素來表明。任何沒有在清單中聲明的服務都不能被系統看到,也不會被運行。
屬性(ATTRIBUTES):
android:enabled
這個屬性用於指示該服務是否可以被實例化。若是設置爲true,則可以被實例化,不然不能被實例化。默認值是true。
<application>元素有它本身的enabled屬性,它的這個屬性適用於應用中全部的組件,包括service組件。對於被啓用的服務,<application>和<service>元素的enabled屬性都必須是true(默認值都是true)。若是有一個元素的enabled屬性被設置爲false,該服務就會被禁用,而不能被實例化。
android:exported
這個屬性用於指示該服務是否可以被其餘應用程序組件調用或跟它交互。若是設置爲true,則可以被調用或交互,不然不能。設置爲false時,只有同一個應用程序的組件或帶有相同用戶ID的應用程序才能啓動或綁定該服務。
它的默認值依賴與該服務所包含的過濾器。沒有過濾器則意味着該服務只能經過指定明確的類名來調用,這樣就是說該服務只能在應用程序的內部使用(由於其餘外部使用者不會知道該服務的類名),所以這種狀況下,這個屬性的默認值是false。另外一方面,若是至少包含了一個過濾器,則意味着該服務能夠給外部的其餘應用提供服務,所以默認值是true。
這個屬性不是限制把服務暴露給其餘應用程序的惟一方法。還可使用權限來限制可以跟該服務交互的外部實體。
android:icon
這個屬性定義了一個表明服務的圖標,它必需要引用一個包含圖片定義的可繪製資源。若是這個屬性沒有設置,則會使用<application>元素的icon屬性所設定的圖標來代替。
不管是<application>元素設置的圖標,仍是<service>元素所設置的圖標,它們都是該服務全部的Intent過濾器的默認圖標。
android:label
這個屬性用於設定一個要顯示給用戶的服務的名稱。若是沒有設置這個屬性,則會使用<application>元素的label屬性值來代替。
不管是<service>設定的標籤,仍是<application>元素設定的標籤,它們都是該服務全部的Intent過濾器的默認標籤。
這個標籤應用引用一個字符串資源,以便它可以像用戶界面中的字符串同樣可以被本地化。可是,爲了開發應用程序方便,也可使用原生字符串來設置這個屬性。
android:name
這個屬性用於指定實現該服務的Service子類的類名。它應該是完整的Java類名(如:com.example.project.RoomService)。可是,也可使用簡寫(如:.RoomService),系統會把<manifest>元素中package屬性所設定的值添加到簡寫名稱的前面。
一旦發佈了應用程序,就不該該改變這個名稱(除非android:exported=」false」)。
這個屬性沒有默認值,名稱必需要指定。
android:permission
這個屬性定義了要啓動或綁定服務的實體必需要有的權限。若是調用者的startService()、bindService()和stopService()方法沒有被授予這個權限,那麼這些方法就不會工做,而且Intent對象也不會發送給改服務。
若是這個屬性沒被設置,那麼經過<appliction>元素的permission屬性所設定的權限就會適用於該服務。若是<application>元素也沒有設置權限,則該服務不授權限保護。
android:process
這個屬性用於設定服務所運行的進程名稱。一般,應用程序的全部組件都運行在給應用程序建立的進程中,進程名與應用程序的包名相同。<application>元素的process屬性可以給應用程序的全部組件設置一個不一樣的默認名稱。可是每一個組件本身的process屬性都可以覆蓋這個默認值,這樣容許把應用程序分離到不一樣的多個進程中。
若是這個屬性值用「:」開頭,則在須要的時候系統會建立一個新的,應用程序私有的進程,而且該服務也會運行在這個進程中。若是這個屬性值用小寫字母開頭,那該服務就會運行在以這個屬性值命名的全局進程中,它提供了使其工做的權限。這樣就容許不一樣的應用程序組件來共享這個進程,從而下降資源的使用。
再說幾個service的屬性標識 android
android:isolatedProcess="true" ,官方解釋:經過指定的[[android:isolatedProcess="true"]]中的[[<service>]]標籤,您的[[Service]]將在沒有自身權限的被隔離的用戶ID進程下運行。 sql
在android4.1中出現 chrome
隔離服務 ,說明這個service將在被隔離的用戶id進程中運行。 app
具體應用實例: wordpress
http://sqliu.wordpress.com/2012/11/26/chrome-for-android%E7%9A%84sandbox%E6%9C%BA%E5%88%B6/ 性能
如何使用Message
zai service li
final Messenger mMessenger = new Messenger(new IncomingHandler());
public IBinder onBinder(Intent intent){
return mMessenger.getBinder();
}
在activity裏的
onServiceConnected方法裏
獲得服務Messenger的引用
mServiceMessenger = new Messenger(service);
//向service注入本activity的Messenger的引用
Message msg = Message.obtain(null,
MessengerService.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger; //主要是經過replyTo將Messenger引用傳過去
mService.send(msg);
這樣,遠程服務就能夠與本activity進行通訊了,並且不須要寫aidl方法
spa