Service 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。
[Android.Runtime.Register("android/app/Service", DoNotGenerateAcw=true)]
public abstract class Service : Android.Content.ContextWrapper, Android.Content.IComponentCallbacks2, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("android/app/Service", DoNotGenerateAcw=true)>]
type Service = class
inherit ContextWrapper
interface IComponentCallbacks
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IComponentCallbacks2
- 繼承
- 衍生
- 屬性
- 實作
備註
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 每個服務類別在其套件 的 AndroidManifest.xml
中都必須有對應的 android.R.styleable#AndroidManifestService <service>
宣告。 服務可以使用 和 android.content.Context#bindService Context.bindService()
啟動 android.content.Context#startService Context.startService()
。
請注意,與其他應用程式物件一樣的服務會在主控進程的主執行緒中執行。 這表示,如果您的服務將執行任何需要大量 CPU 的 (,例如 MP3 播放) ,或封鎖網路) 作業之類的 (,它應該繁衍自己的執行緒來執行該工作。 如需詳細資訊,請參閱 進程和執行緒。 類別 androidx.core.app.JobIntentService
可做為服務的標準實作,其具有自己的執行緒,其會排程要完成的工作。
這裡涵蓋的主題: < ol >< li > 什麼是服務? <li > 服務生命週期 < li 許可權 < li >> 進程生命週期 < li 本機服務範例 li >> Remote Messenger Service Sample << /ol>
<div class=「special reference」 >< h3 > Developer Guides < /h3>
如需有關如何建立服務的詳細討論,請參閱 服務 開發人員指南。
</Div>
「WhatIsAService」 >< h3 > 什麼是服務? </h3>
服務類別大部分的混淆實際上會圍繞其 < 不是 >< /em > 的內容:
<ul >< li > A Service 不是 <<> /b > 個別的程式。 Service 物件本身並不表示它正在自己的進程中執行;除非另有指定,否則它會在與其所屬應用程式相同的進程中執行。 <li > A Service 不是 <>< /b > 執行緒。 這並不表示本身會關閉主執行緒 (,以避免應用程式未回應錯誤) 。 </ul>
因此,服務本身實際上非常簡單,提供兩個主要功能:
<ul >< li > 應用程式設施,告知系統 < em > about < /em > 想要在背景 (,即使使用者未直接與應用程式互動) 也一樣。 這會對應至 android.content.Context#startService Context.startService()
的呼叫,要求系統排程服務的工作,直到服務或其他人員明確停止為止。 <li > 應用程式的功能,可將某些功能公開給其他應用程式。 這會對應至 的 android.content.Context#bindService Context.bindService()
呼叫,允許對服務進行長期連線,以便與其互動。 </ul>
當實際建立服務元件時,基於上述任一原因,系統實際上所做的一切都是具現化元件,並在主執行緒上呼叫它 #onCreate
和任何其他適當的回呼。 服務必須以適當的行為實作這些,例如建立執行其工作的次要執行緒。
請注意,因為服務本身很簡單,所以您可以像您想要一樣簡單或複雜地與它互動:從將它視為在 (本機 JAVA 物件上進行直接方法呼叫,如本機服務範例) 所示,使用 AIDL 提供完整的可遠端介面。
「ServiceLifecycle」 >< h3 > 服務生命週期 < /h3>
有兩個原因可供系統執行服務。 如果有人呼叫 android.content.Context#startService Context.startService()
,系統就會擷取服務 (建立服務,並視需要呼叫其 #onCreate
方法) ,然後使用用戶端所提供的引數呼叫其 #onStartCommand
方法。 服務此時會繼續執行,直到 android.content.Context#stopService Context.stopService()
呼叫 或 #stopSelf()
為止。 請注意,對 CoNtext.startService () 的多個呼叫不會巢狀化 (,不過它們會導致對 onStartCommand () ) 進行多個對應的呼叫,因此無論啟動服務多少次都會在呼叫 CoNtext.stopService () 或 stopSelf () 之後停止;不過,服務可以使用其 #stopSelf(int)
方法來確保服務在處理已啟動的意圖之前不會停止。
針對已啟動的服務,有兩種額外的主要作業模式可以決定在 中執行,視它們從 onStartCommand () 傳回的值而定: #START_STICKY
會用於明確啟動和停止的服務,而 #START_NOT_STICKY
或 #START_REDELIVER_INTENT
用於處理傳送給他們的任何命令時,應該只執行的服務。 如需語意的詳細資訊,請參閱連結的檔。
用戶端也可以使用 android.content.Context#bindService Context.bindService()
來取得服務的持續連線。 如果服務尚未在執行 (呼叫,則這樣做) ,但不會呼叫 #onCreate
onStartCommand () ,則同樣會建立服務。 用戶端會接收 android.os.IBinder
服務從其 #onBind
方法傳回的物件,讓用戶端接著對服務進行呼叫。 只要建立連線 (用戶端是否在服務的 IBinder) 上保留參考,服務就會繼續執行。 通常傳回的 IBinder 適用于以 aidl 撰寫的複雜介面。
服務可以同時啟動,並且有與其系結的連線。 在這種情況下,只要服務已啟動 < em > 或 < /em > , android.content.Context#BIND_AUTO_CREATE Context.BIND_AUTO_CREATE
系統就會使用 旗標來讓服務保持執行。 一旦這兩種情況都未保留,就會呼叫服務的 #onDestroy
方法,並有效地終止服務。 所有清除 (停止執行緒,在從 onDestroy () 傳回時,應該完成取消註冊接收者) 。
「Permissions」 >< h3 > Permissions < /h3>
在資訊清單的 android.R.styleable#AndroidManifestService <service>
標記中宣告服務時,可以強制執行服務的全域存取。 如此一來,其他應用程式就必須在自己的資訊清單中宣告對應的 android.R.styleable#AndroidManifestUsesPermission <uses-permission>
元素,才能啟動、停止或系結至服務。
android.os.Build.VERSION_CODES#GINGERBREAD
使用 時 Context#startService(Intent) Context.startService(Intent)
,您也可以在意圖上設定 Intent#FLAG_GRANT_READ_URI_PERMISSION Intent.FLAG_GRANT_READ_URI_PERMISSION
和/或 Intent#FLAG_GRANT_WRITE_URI_PERMISSION Intent.FLAG_GRANT_WRITE_URI_PERMISSION
。 這會將意圖中特定 URI 的暫時存取權授與服務。 在服務針對 #stopSelf(int)
該啟動命令或更新的命令呼叫之前,或直到服務完全停止為止,存取權會維持不變。 這適用于授與未要求保護服務之許可權的其他應用程式存取權,或即使完全未匯出服務亦然。
此外,服務可以使用許可權保護個別 IPC 呼叫,方法是先呼叫 #checkCallingPermission
方法,再執行該呼叫的實作。
如需一般許可權和安全性的詳細資訊,請參閱 安全性和許可權 檔。
「ProcessLifecycle」 >< h3 > Process Lifecycle < /h3>
只要服務已啟動或用戶端系結至服務,Android 系統就會嘗試讓裝載服務的進程維持在周圍。 當記憶體不足且需要終止現有進程時,裝載服務的進程優先順序會高於下列可能性:
<ul >< li>
如果服務目前正在其 #onCreate onCreate()
、 #onStartCommand onStartCommand()
或 #onDestroy onDestroy()
方法中執行程式碼,則裝載進程會是前景進程,以確保此程式碼可在不遭到終止的情況下執行。 <li>
如果服務已啟動,則其裝載進程會被視為比使用者螢幕上目前看得見的任何進程還不重要,但比不可見的任何進程更重要。 因為使用者通常只會看到幾個進程,這表示除非記憶體不足的情況,否則不應該終止服務。 不過,由於使用者無法直接察覺背景服務,因此在該狀態下, < em > 會 <> 被視為有效的終止候選項目,因此您應該準備好發生這種情況。 特別是,長時間執行的服務將會越來越可能終止,而且保證會在適當的情況下 (終止,並在適當) 如果持續啟動的時間夠長,則會重新開機。 <li>
如果有系結至服務的用戶端,則服務的裝載進程永遠不會比最重要的用戶端少。 也就是說,如果使用者可以看到其中一個用戶端,服務本身就會被視為可見。 用戶端的重要性影響服務重要性的方式可以透過 、 Context#BIND_ALLOW_OOM_MANAGEMENT
、 Context#BIND_WAIVE_PRIORITY
、 Context#BIND_IMPORTANT
和 Context#BIND_ADJUST_WITH_ACTIVITY
來 Context#BIND_ABOVE_CLIENT
調整。 <li>
已啟動的服務可以使用 #startForeground(int, Notification)
API 將服務置於前景狀態,其中系統會將其視為使用者主動察覺到的一些專案,因此在記憶體不足時,不是終止的候選項目。 (理論上,服務在目前前景應用程式的記憶體壓力下仍可能終止,但實際上這不應該是問題。) < /ul>
請注意,這表示您的服務在大部分情況下執行時,如果系統處於大量記憶體壓力,系統可能會將其終止。 如果發生這種情況,系統稍後會嘗試重新開機服務。 這一點的重要結果是,如果您實 #onStartCommand onStartCommand()
作排程工作以非同步方式或在另一個執行緒中完成,則您可能想要使用 #START_FLAG_REDELIVERY
讓系統為您重新傳遞意圖,以便在處理服務時不會遺失。
其他與服務 (相同的進程中執行的應用程式元件,例如 android.app.Activity
) 可以增加整體程式的重要性,而不只是服務本身的重要性。
「LocalServiceSample」 >< h3 > 本機服務範例 < /h3>
服務最常見的用法之一是做為與應用程式其他部分一起執行的次要元件,其程式與其余元件相同。 除非另有明確說明,否則 .apk 的所有元件都會在相同的進程中執行,因此這是一般情況。
以這種方式使用時,假設元件位於相同的進程中,您可以大幅簡化它們之間的互動:服務的用戶端可以直接將接收的 IBinder 轉換成服務所發行的具體類別。
此處顯示這項服務的用法範例。 首先是服務本身,系結時發佈自訂類別:
{
此頁面的部分是根據所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。
建構函式
Service() | |
Service(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
欄位
AccessibilityService |
|
AccountService |
|
ActivityService |
使用 搭配 |
AlarmService |
|
AppOpsService |
|
AppSearchService |
|
AppwidgetService |
|
AudioService |
|
BatteryService |
|
BindAllowActivityStarts |
已淘汰.
|
BindExternalServiceLong |
的運作方式 |
BindNotPerceptible |
已淘汰.
|
BindSharedIsolatedProcess |
已淘汰.
旗 |
BiometricService |
|
BlobStoreService |
|
BluetoothService |
|
BugreportService |
擷取 Bugreport 的服務。 (繼承來源 Context) |
CameraService |
|
CaptioningService |
|
CarrierConfigService |
|
ClipboardService |
|
CompanionDeviceService |
|
ConnectivityDiagnosticsService |
|
ConnectivityService |
|
ConsumerIrService |
|
CredentialService |
|
CrossProfileAppsService |
|
DeviceIdDefault |
預設裝置識別碼,這是主要 (非虛擬) 裝置的識別碼。 (繼承來源 Context) |
DeviceIdInvalid |
不正確裝置識別碼。 (繼承來源 Context) |
DeviceLockService |
|
DevicePolicyService |
使用 搭配 |
DisplayHashService |
使用 搭配 |
DisplayService |
|
DomainVerificationService |
使用 搭配 |
DownloadService |
|
DropboxService |
|
EuiccService |
|
FileIntegrityService |
|
FingerprintService |
|
GameService |
|
GrammaticalInflectionService |
|
HardwarePropertiesService |
使用 搭配 |
HealthconnectService |
|
InputMethodService |
|
InputService |
|
IpsecService |
|
JobSchedulerService |
|
KeyguardService |
|
LauncherAppsService |
|
LayoutInflaterService |
|
LocaleService |
|
LocationService |
|
MediaCommunicationService |
|
MediaMetricsService |
|
MediaProjectionService |
|
MediaRouterService |
|
MediaSessionService |
|
MidiService |
|
NetworkStatsService |
|
NfcService |
|
NotificationService |
|
NsdService |
|
OverlayService |
|
PeopleService |
使用 與 |
PerformanceHintService |
|
PowerService |
|
PrintService |
|
ReceiverExported |
已淘汰.
旗 |
ReceiverNotExported |
已淘汰.
|
ReceiverVisibleToInstantApps |
已淘汰.
旗 |
RestrictionsService |
|
RoleService |
|
SearchService |
|
SensorService |
|
ShortcutService |
|
StatusBarService |
使用 搭配 |
StopForegroundDetach |
已淘汰.
的 |
StopForegroundLegacy |
的 |
StopForegroundRemove |
已淘汰.
的 |
StorageService |
|
StorageStatsService |
|
SystemHealthService |
|
TelecomService |
|
TelephonyImsService |
|
TelephonyService |
|
TelephonySubscriptionService |
|
TextClassificationService |
|
TextServicesManagerService |
|
TvInputService |
|
TvInteractiveAppService |
|
UiModeService |
|
UsageStatsService |
|
UsbService |
|
UserService |
|
VibratorManagerService |
|
VibratorService |
|
VirtualDeviceService |
|
VpnManagementService |
|
WallpaperService |
|
WifiAwareService |
|
WifiP2pService |
|
WifiRttRangingService |
|
WifiService |
|
WindowService |
|
屬性
Application |
傳回擁有此服務的應用程式。 |
ApplicationContext |
傳回目前進程之單一全域 Application 物件的內容。 (繼承來源 ContextWrapper) |
ApplicationInfo |
傳回此內容套件的完整應用程式資訊。 (繼承來源 ContextWrapper) |
Assets |
傳回應用程式套件的 AssetManager 實例。 (繼承來源 ContextWrapper) |
AttributionSource |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Context) |
AttributionTag |
屬性可用於複雜的應用程式中,以邏輯方式分隔應用程式的各個部分。 (繼承來源 Context) |
BaseContext | (繼承來源 ContextWrapper) |
CacheDir |
傳回檔案系統上應用程式特定快取目錄的絕對路徑。 (繼承來源 ContextWrapper) |
Class |
傳回這個 |
ClassLoader |
傳回類別載入器,您可以用來擷取此套件中的類別。 (繼承來源 ContextWrapper) |
CodeCacheDir |
傳回檔案系統上應用程式特定快取目錄的絕對路徑,此目錄是專為儲存快取程式碼所設計。 (繼承來源 ContextWrapper) |
ContentResolver |
傳回應用程式套件的 ContentResolver 實例。 (繼承來源 ContextWrapper) |
DataDir |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 ContextWrapper) |
DeviceId |
取得與此內容相關聯的裝置識別碼。 (繼承來源 Context) |
Display |
取得與此內容相關聯的顯示。 (繼承來源 Context) |
ExternalCacheDir |
傳回主要外部檔案系統上目錄的絕對路徑, (位於 ExternalStorageDirectory 應用程式可放置它擁有之快取檔案的位置。 (繼承來源 ContextWrapper) |
FilesDir |
傳回檔案系統上用來儲存檔案 OpenFileOutput(String, FileCreationMode) 的絕對路徑。 (繼承來源 ContextWrapper) |
ForegroundServiceType |
如果服務已透過呼叫 成為前景服務 |
Handle |
基礎 Android 實例的控制碼。 (繼承來源 Object) |
IsDeviceProtectedStorage |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 ContextWrapper) |
IsRestricted |
指出此內容是否受到限制。 (繼承來源 Context) |
IsUiContext |
|
JniIdentityHashCode |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
JniPeerMembers |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 |
MainExecutor |
傳回 , |
MainLooper |
傳回目前進程之主執行緒的迴圈器。 (繼承來源 ContextWrapper) |
NoBackupFilesDir |
傳回檔案系統上目錄的絕對路徑, FilesDir 類似于 。 (繼承來源 ContextWrapper) |
ObbDir |
如果找到任何) ,則傳回此應用程式 OBB 檔案 (的主要外部儲存目錄。 (繼承來源 ContextWrapper) |
OpPackageName |
傳回應該用於 |
PackageCodePath |
傳回此內容主要 Android 套件的完整路徑。 (繼承來源 ContextWrapper) |
PackageManager |
傳回 PackageManager 實例,以尋找全域套件資訊。 (繼承來源 ContextWrapper) |
PackageName |
傳回此應用程式套件的名稱。 (繼承來源 ContextWrapper) |
PackageResourcePath |
傳回此內容主要 Android 套件的完整路徑。 (繼承來源 ContextWrapper) |
Params |
如果透過 |
PeerReference |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
Resources |
傳回應用程式套件的資源實例。 (繼承來源 ContextWrapper) |
Theme |
傳回與此 CoNtext 相關聯的 Theme 物件。 (繼承來源 ContextWrapper) |
ThresholdClass |
此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。 |
ThresholdType |
此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。 |
Wallpaper | (繼承來源 ContextWrapper) |
WallpaperDesiredMinimumHeight | (繼承來源 ContextWrapper) |
WallpaperDesiredMinimumWidth | (繼承來源 ContextWrapper) |
方法
明確介面實作
IJavaPeerable.Disposed() |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
IJavaPeerable.Finalized() |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
IJavaPeerable.JniManagedPeerState |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 (繼承來源 Object) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 |
GetJniTypeName(IJavaPeerable) |
服務是應用程式元件,代表應用程式想要執行較長時間執行的作業,但不會與使用者互動,或提供其他應用程式使用的功能。 |