首页 / Android 入门教程 / 系统服务概览

Android 入门教程

系统服务概览

本教程共 100 篇 · 第 86 篇 · 更新于 2026-07-28 · 约 7 分钟阅读

AndroidAndroid 入门教程系统服务WindowManagerAlarmManagerVibratorSensorManager

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 影响)。
Warning

Android 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()
Warning

WakeLock 滥用会严重耗电,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
}
Warning

Android 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

无障碍服务,能给残障用户提供辅助。复杂,单独成章。能用系统的无障碍设置就别自己写服务。

常见坑

  1. 服务为 null:有些服务在特定设备上不存在(如 Vibrator),用前判空。
  2. WakeLock 忘记 release:耗电严重,最终 ANR。try-finally 必释放。
  3. AlarmManager 精确闹钟没申请权限:Android 12+ 崩。
  4. 老版本用 vibrate(long) API:废弃,用 VibrationEffect
  5. ConnectivityManager 老写法getActiveNetworkInfo() 废弃,用 NetworkCapabilities
  6. 后台读剪贴板:Android 10+ 限制,会返回空或者需要前台。

小结

系统服务通过 getSystemService(类型::class.java) 获取。常用:WindowManager(窗口)、AlarmManager(定时)、PowerManager(电源)、Vibrator(震动)、SensorManager(传感器)、NotificationManager(通知)、ConnectivityManager(网络)、AudioManager(音频)。每种服务权限和使用限制不同,注意版本差异。

下一章讲深层链接,让外部链接直接打开应用内特定页面。