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()
。
请注意,与其他应用程序对象一样,服务在其宿主进程的main线程中运行。 这意味着,如果服务要执行任何 CPU 密集型 ((例如 MP3 播放) 或阻止 ((如网络) 操作),它应生成自己的线程,在其中执行该工作。 有关此方面的详细信息,请参阅 进程和线程。 类 androidx.core.app.JobIntentService
作为 Service 的标准实现提供,Service 具有自己的线程,可在其中计划完成其工作。
此处涵盖的主题: <ol><li>什么是服务?<li>Service Lifecycle<li>Permissions<li>Process Lifecycle<li>Local Service Sample<li>Remote Messenger Service Sample</ol>
<div class=“special reference”><h3>Developer Guides</h3>
有关如何创建服务的详细讨论,请阅读 服务 开发人员指南。
</Div>
“WhatIsAService”><h3>什么是服务?</h3>
有关 Service 类的大多数混淆实际上都围绕它不是<></em:>
<ul><li> A 服务是<一><>个单独的进程。 Service 对象本身并不表示它在其自己的进程中运行;除非另有指定,否则它在与它所属的应用程序相同的进程中运行。 <li> A 服务是 <b>不是<>线程。 它本身并不是在main线程 (执行工作以避免应用程序未响应错误) 。 </ul>
因此,服务本身实际上非常简单,提供两个main功能:
<ul><li>一个工具,用于告知系统 <em><> 它希望在后台 (执行的操作,即使用户未直接与应用程序) 交互也是如此。 这对应于对 android.content.Context#startService Context.startService()
的调用,该调用要求系统计划服务的工作,直到服务或其他人显式停止它为止。 <li>应用程序向其他应用程序公开其某些功能的工具。 这对应于对 android.content.Context#bindService Context.bindService()
的调用,后者允许与服务建立长期连接,以便与其交互。 </ul>
当实际创建服务组件时,出于上述任一原因,系统实际执行的所有操作就是实例化该组件,并在main线程上调用其#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 编写的复杂接口。
服务既可以启动,也可以有绑定到它的连接。 在这种情况下,只要服务启动<><或/或>有一个或多个带有 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)
,或者直到服务完全停止为止。 这适用于授予其他应用的访问权限,这些应用未请求保护服务的权限,甚至根本不导出服务时也是如此。
此外,服务可以通过在执行该调用的实现之前调用 #checkCallingPermission
方法,使用权限保护对它的单个 IPC 调用。
有关 权限和安全性 的一般详细信息,请参阅安全和权限文档。
“ProcessLifecycle”><h3>进程生命周期</h3>
只要服务已启动或有绑定到它的客户端,Android 系统将尝试使承载服务的进程保持在周围。 当内存不足且需要终止现有进程时,承载服务的进程的优先级将高于以下可能性:
<ul><li>
如果服务当前正在执行其 #onCreate onCreate()
、 #onStartCommand onStartCommand()
或 #onDestroy onDestroy()
方法中的代码,则宿主进程将是一个前台进程,以确保此代码可以在不终止的情况下执行。 <李>
如果服务已启动,则其托管进程被认为不如屏幕上用户当前可见的任何进程重要,但比任何不可见的进程更重要。 由于通常只有少数进程对用户可见,这意味着不应终止服务,除非在内存不足的情况下。 但是,由于用户不直接知道后台服务,因此在该状态下,它<><>被视为要终止的有效候选项,因此你应该为此做好准备。 特别是,长时间运行的服务将越来越可能终止,并保证在适当的情况下 (终止并重启) 如果服务启动时间足够长。 <李>
如果存在绑定到服务的客户端,则服务的托管进程永远不会比最重要的客户端重要。 也就是说,如果其中一个客户端对用户可见,则服务本身被视为可见。 客户端的重要性影响服务重要性的方式可以通过 、、Context#BIND_ALLOW_OOM_MANAGEMENT
、Context#BIND_WAIVE_PRIORITY
Context#BIND_IMPORTANT
、 和 Context#BIND_ADJUST_WITH_ACTIVITY
进行调整Context#BIND_ABOVE_CLIENT
。 <李>
启动的服务可以使用 #startForeground(int, Notification)
API 将服务置于前台状态,其中系统将其视为用户主动意识到的内容,因此不会在内存不足时将其视为终止的候选项。 (理论上,在当前前台应用程序的极端内存压力下,服务仍有可能终止,但实际上这不应引起关注。) </ul>
请注意,这意味着大多数情况下,如果服务在内存压力过大的情况下,系统可能会终止该服务。 如果发生这种情况,系统将稍后尝试重启服务。 其一个重要后果是,如果实现 #onStartCommand onStartCommand()
以计划以异步方式或在另一个线程中完成的工作,则你可能希望使用 #START_FLAG_REDELIVERY
让系统为你重新传递意向,以便在处理服务时终止服务时不会丢失它。
当然,在与服务 (相同的进程中运行的其他应用程序组件(如 android.app.Activity
) )可以增加整个进程的重要性,而不仅仅是服务本身的重要性。
“LocalServiceSample”><h3>本地服务示例</h3>
服务最常见的用途之一是作为辅助组件与应用程序的其他部分一起运行,与其余组件在同一进程中运行。 除非另有明确说明,否则 .apk 的所有组件都在同一进程中运行,因此这是一种典型情况。
以这种方式使用时,假设组件位于同一进程中,可以大大简化它们之间的交互:服务的客户端只需将他们从组件接收的 IBinder 强制转换为服务发布的具体类。
此处显示了服务的此用法示例。 首先是服务本身,在绑定时发布自定义类:
{
此页面的某些部分是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的条款使用。
构造函数
Service() | |
Service(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
字段
AccessibilityService |
使用 和 |
AccountService |
使用 和 |
ActivityService |
使用 和 |
AlarmService |
使用 和 |
AppOpsService |
使用 和 |
AppSearchService |
使用 和 |
AppwidgetService |
使用 和 |
AudioService |
使用 和 |
BatteryService |
使用 和 |
BindAllowActivityStarts |
已过时.
标志 |
BindExternalServiceLong |
的工作方式与 相同 |
BindNotPerceptible |
已过时.
标志 |
BindSharedIsolatedProcess |
已过时.
标志 |
BiometricService |
与 配合使用 |
BlobStoreService |
使用 和 |
BluetoothService |
使用 和 |
BugreportService |
用于捕获 bug 报告的服务。 (继承自 Context) |
CameraService |
使用 来 |
CaptioningService |
使用 和 |
CarrierConfigService |
使用 和 |
ClipboardService |
使用 和 |
CompanionDeviceService |
使用 和 |
ConnectivityDiagnosticsService |
使用 和 |
ConnectivityService |
使用 和 |
ConsumerIrService |
使用 和 |
CredentialService |
使用 和 |
CrossProfileAppsService |
使用 和 |
DeviceIdDefault |
默认设备 ID,即主 (非虚拟) 设备的 ID。 (继承自 Context) |
DeviceIdInvalid |
设备 ID 无效。 (继承自 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 |
获取与此上下文关联的设备 ID。 (继承自 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 |
返回当前进程的main线程的 Looper。 (继承自 ContextWrapper) |
NoBackupFilesDir |
返回文件系统上目录的绝对路径,类似于 FilesDir。 (继承自 ContextWrapper) |
ObbDir |
返回主外部存储目录,如果可以找到任何) ,则此应用程序的 OBB 文件 (。 (继承自 ContextWrapper) |
OpPackageName |
返回应用于 |
PackageCodePath |
返回此上下文的主 Android 包的完整路径。 (继承自 ContextWrapper) |
PackageManager |
返回 PackageManager 实例以查找全局包信息。 (继承自 ContextWrapper) |
PackageName |
返回此应用程序的包的名称。 (继承自 ContextWrapper) |
PackageResourcePath |
返回此上下文的主 Android 包的完整路径。 (继承自 ContextWrapper) |
Params |
返回创建此上下文时所使用的参数集(如果它是通过 |
PeerReference |
服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行长时间运行的操作,或者提供供其他应用程序使用的功能。 (继承自 Object) |
Resources |
返回应用程序包的 Resources 实例。 (继承自 ContextWrapper) |
Theme |
返回与此上下文关联的 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) |
服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行长时间运行的操作,或者提供供其他应用程序使用的功能。 |