系统服务概览
本教程共 100 篇 · 第 86 篇 · 更新于 2026-07-28 · 约 7 分钟阅读
86. 系统服务概览
本节目标:理解 Android 系统服务的概念,学会用
getSystemService获取服务,了解常见服务(WindowManager、AlarmManager、PowerManager、Vibrator 等)的定位和用法。
Android 系统提供了一堆「系统服务」,应用通过它们访问系统能力:窗口管理、电源、震动、传感器、闹钟等。这章梳理常用的几个。
什么是系统服务
系统服务是 Android 系统进程里运行的 singleton 对象,应用通过 Binder 跨进程调用。每个服务管一类系统能力。
打个比方,系统服务像政府部门:户籍科管身份、电力局管供电、地震局管监测。你要办相关的事,就去对应部门申请,不能自己瞎搞。
获取服务:
val windowManager = getSystemService(WindowManager::class.java)
val alarmManager = getSystemService(AlarmManager::class.java)
val vibrator = getSystemService(Vibrator::class.java)
或者用字符串 key(老写法,不推荐):
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
Tip新写法用类型 class,不用强转。Android 12+ 用类型版,老版本兼容用
ContextCompat.getSystemService。
WindowManager
管理窗口,包括应用窗口、状态栏高度、屏幕方向等。
常见用法:
val wm = getSystemService(WindowManager::class.java)
// 屏幕尺寸(API 30+)
val metrics = wm.currentWindowMetrics
val bounds = metrics.bounds
val width = bounds.width()
val height = bounds.height()
// 老版本
val display = wm.defaultDisplay
val point = Point()
display.getRealSize(point)
还能监听屏幕旋转、获取状态栏高度等。Compose 里大部分窗口逻辑被封装了,直接用窗口服务少。
AlarmManager
定时触发任务,即使应用关闭也能唤醒。
val alarmManager = getSystemService(AlarmManager::class.java)
val triggerAtMs = System.currentTimeMillis() + 60 * 1000 // 1 分钟后
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerAtMs,
pendingIntent
)
几种类型:
set:不精确,系统合并省电。setExact:精确,但不唤醒设备。setExactAndAllowWhileIdle:精确 + 唤醒,闹钟应用用。setRepeating:周期触发,但不精确(受 Doze 影响)。
WarningAndroid 12(API 31)起,精确闹钟要申请
SCHEDULE_EXACT_ALARM权限。普通应用默认不给,要用户在设置里开。能不用精确闹钟就别用,用 WorkManager 替代。
PowerManager
电源管理,能保持 CPU 唤醒、查询电量等。
val powerManager = getSystemService(PowerManager::class.java)
// 检查是否省电模式
val isPowerSave = powerManager.isPowerSaveMode
// 创建 WakeLock,保持 CPU 唤醒
val wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"MyApp::MyTag"
)
wakeLock.acquire(10 * 60 * 1000L) // 10 分钟
// 用完释放
wakeLock.release()
WarningWakeLock 滥用会严重耗电,Google Play 审核严格。能用 WorkManager 就别用 WakeLock。
Vibrator
震动反馈。
// API 31+
val vibrator = getSystemService(Vibrator::class.java)
val effect = VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)
vibrator.vibrate(effect)
// 老版本(已废弃)
// vibrator.vibrate(100)
复杂震动模式:
val timings = longArrayOf(0, 100, 50, 100) // 等待、震动、等待、震动
val amplitudes = intArrayOf(0, 255, 0, 128)
val effect = VibrationEffect.createWaveform(timings, amplitudes, -1)
vibrator.vibrate(effect)
Android 12+ 支持预定义效果:
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_DOUBLE_CLICK))
vibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK))
需要权限:
<uses-permission android:name="android.permission.VIBRATE" />
SensorManager
传感器管理。第 91 章详讲。
val sensorManager = getSystemService(SensorManager::class.java)
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
NotificationManager
通知管理。前面章节详讲。
val notificationManager = getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
notificationManager.notify(id, notification)
ConnectivityManager
网络状态。
val cm = getSystemService(ConnectivityManager::class.java)
val activeNetwork = cm.activeNetwork
val caps = cm.getNetworkCapabilities(activeNetwork)
val hasInternet = caps?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
val isWifi = caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true
监听网络变化:
cm.registerNetworkCallback(
NetworkRequest.Builder().build(),
object : NetworkCallback() {
override fun onAvailable(network: Network) { }
override fun onLost(network: Network) { }
}
)
AudioManager
音频管理,调音量、查耳机状态、抢音频焦点。
val audioManager = getSystemService(AudioManager::class.java)
// 调整音量
audioManager.adjustVolume(AudioManager.ADJUST_RAISE, 0)
// 查询当前音量
val current = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
// 抢音频焦点(播放音乐时)
val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build()
)
.build()
audioManager.requestAudioFocus(focusRequest)
KeyguardManager / WindowManager for lock screen
锁屏状态查询:
val keyguardManager = getSystemService(KeyguardManager::class.java)
val isLocked = keyguardManager.isKeyguardLocked
val isSecure = keyguardManager.isDeviceSecure
ClipboardManager
剪贴板。
val clipboard = getSystemService(ClipboardManager::class.java)
clipboard.setPrimaryClip(ClipData.newPlainText("label", "复制的文本"))
// 读取(API 10+ 限制)
if (clipboard.hasPrimaryClip()) {
val text = clipboard.primaryClip?.getItemAt(0)?.text
}
WarningAndroid 10+ 限制后台读剪贴板。读取要在用户主动操作时(比如点「粘贴」按钮),系统会弹提示。
InputMethodManager
输入法管理,控制软键盘显示:
val imm = getSystemService(InputMethodManager::class.java)
imm.showSoftInput(view, 0)
imm.hideSoftInputFromWindow(view.windowToken, 0)
Compose 里用 LocalSoftwareKeyboardController:
val keyboardController = LocalSoftwareKeyboardController.current
Button(onClick = { keyboardController?.hide() }) {
Text("收起键盘")
}
AccessibilityService
无障碍服务,能给残障用户提供辅助。复杂,单独成章。能用系统的无障碍设置就别自己写服务。
常见坑
- 服务为 null:有些服务在特定设备上不存在(如
Vibrator),用前判空。 - WakeLock 忘记 release:耗电严重,最终 ANR。try-finally 必释放。
- AlarmManager 精确闹钟没申请权限:Android 12+ 崩。
- 老版本用
vibrate(long)API:废弃,用VibrationEffect。 - ConnectivityManager 老写法:
getActiveNetworkInfo()废弃,用NetworkCapabilities。 - 后台读剪贴板:Android 10+ 限制,会返回空或者需要前台。
小结
系统服务通过 getSystemService(类型::class.java) 获取。常用:WindowManager(窗口)、AlarmManager(定时)、PowerManager(电源)、Vibrator(震动)、SensorManager(传感器)、NotificationManager(通知)、ConnectivityManager(网络)、AudioManager(音频)。每种服务权限和使用限制不同,注意版本差异。
下一章讲深层链接,让外部链接直接打开应用内特定页面。