1 典型的 Android 前台服务设置过程
包括创建一个通知通道、构建一个通知,以及将服务设置为前台状态。
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Notification notification = createNotification();
startForeground(1, notification);
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_VIEW_SCROLLED; // 监听长按事件
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
info.notificationTimeout = 100;
this.setServiceInfo(info);
}
private Notification createNotification() {
String channelID = "MyAccessibilityServiceChannel";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
channelID,
"Accessibility Service Channel",
NotificationManager.IMPORTANCE_LOW);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID);
builder.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Service Active")
.setContentText("Accessibility service is running")
.setPriority(NotificationCompat.PRIORITY_LOW);
return builder.build();
}
1.1 创建通知通道
从 Android O(API 级别 26)开始,所有的通知都必须通过一个“通知通道”发布。这一机制允许用户通过系统设置对不同类型的通知进行更细粒度的控制。例如,用户可以选择屏蔽某个通知通道的声音,或者完全隐藏该通道的通知。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
channelID,
"Accessibility Service Channel",
NotificationManager.IMPORTANCE_LOW);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
}
这段代码首先检查运行的 Android 版本是否大于等于 API 级别 26。如果是,就创建一个新的 NotificationChannel
。这个通道被设置了三个参数:
channelID
:通道的唯一标识。"Accessibility Service Channel"
:通道的用户可见名称。NotificationManager.IMPORTANCE_LOW
:设置通道的重要性级别为低。这意味着通知不会有干扰用户的弹出行为,也不会显示状态栏图标。在 Android Oreo(API 级别 26)及以上版本中,通知的显示受到通知通道重要性等级的影响。如果您将通知通道的重要性设置为 NotificationManager.IMPORTANCE_LOW 或更低,通知可能不会在状态栏显示图标,尤其是在一些定制的Android系统如MIUI、EMUI上。
1.2 构建通知
一旦有了通知通道,接下来就是构建通知本身了。
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID);
builder.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Service Active")
.setContentText("Accessibility service is running")
.setPriority(NotificationCompat.PRIORITY_LOW);
return builder.build();
这段代码使用 NotificationCompat.Builder
创建通知,这是一个支持向后兼容的API。Builder
构造函数接受两个参数:上下文(this
指当前服务)和之前创建的通知通道的 ID。通知的各个参数如下:
setSmallIcon(R.drawable.ic_notification)
:设置通知的小图标,这是必须的。setContentTitle("Service Active")
和setContentText("Accessibility service is running")
:设置通知的标题和文本内容。setPriority(NotificationCompat.PRIORITY_LOW)
:尽管 Android O 及以上的优先级主要通过通道控制,这里仍旧设置了兼容性的优先级标志。
Android 的 NotificationManager 是一个系统级服务,它用于向用户展示来自各种应用的信息。这种信息展示通常是通过状态栏的通知完成的,可以提供即时的反馈、警告或其他通信,无论用户当前正在使用的是什么应用。NotificationManager 对于管理这些通知至关重要,从创建、更新到取消,都通过这个服务来处理。
创建通知:
在 Android 应用中,要发送通知给用户,你需要通过 NotificationManager。首先,你会创建一个 Notification 对象,通常使用 Notification.Builder 或 NotificationCompat.Builder 类来构建。这个对象包含了所有关于通知的信息,比如标题、正文文本、图标和声音等。
显示通知:
创建了 Notification 对象之后,可以通过调用 NotificationManager 的 notify() 方法来显示通知。这个方法接收一个唯一的 ID 和 Notification 对象。如果应用程序再次使用相同的 ID 调用 notify() 方法,原来的通知就会被更新。
取消通知:
如果需要取消通知,可以调用 NotificationManager 的 cancel() 方法,并传入之前用于显示通知时的 ID。还可以调用 cancelAll() 来取消应用产生的所有通知。
创建通知通道:
要创建通知通道,你需要构建一个 NotificationChannel 对象,并设置通道的重要性等级、描述及其他行为。然后,通过 NotificationManager.createNotificationChannel() 方法来提交你的通道配置。
使用通知通道:
创建通知时,你需要指定希望通知使用的通知通道的ID。这意味着所有的通知现在都需要指定一个通知通道,否则通知将不会显示。
1.3 启动前台服务
最后,服务通过调用 startForeground()
方法,将自己置为前台状态,这通常用于确保服务不被系统在内存不足时杀死。
startForeground(1, notification);
这个方法接受两个参数:
- 通知的 ID(
1
),这个 ID 必须是唯一的整数,用于标识通知。 - 构建的通知对象。
总结
这种方法的使用是因为 Android 系统倾向于为了节省资源而终止后台服务,但对前台服务的处理则更为温和,因为它们被认为是对用户当前操作更为重要的服务。通过将服务置为前台,并展示一个通知,系统和用户都能明确知道有一个活跃的进程在运行,这有助于保持服务的持续运行,尤其是对于那些需要长时间运行的服务。
2 将服务置为前台服务必须展示一个通知
这是 Android 系统设计的一个重要方面,目的是为了确保用户对正在运行的服务具有清晰的认知和控制。这个设计有几个关键的原因和意义:
2.1 用户透明度
Android 系统要求所有前台服务都必须有一个与之关联的通知,这样做是为了保证用户能够清楚地看到哪些应用正在后台运行。这增加了系统的透明度,使用户可以直观地知道哪些服务正在运行,并了解这些服务的目的。这种透明度是用户隐私和控制的重要方面,用户可以随时查看和管理这些服务。
2.2 用户控制
通过强制显示通知,用户可以直接从通知面板中对服务进行控制,例如停止服务。这不仅提供了方便的用户界面来管理正在运行的服务,还增强了用户对设备行为的控制权。
2.3 防止滥用
如果没有这种强制通知的机制,应用程序可能会在后台无限制地运行服务,消耗设备资源,如电池和数据,而用户可能完全不知情。通过要求所有前台服务都有一个可见的通知,系统帮助防止了应用滥用后台运行的可能性,从而保护了用户的设备性能和电池寿命。
2.4 系统资源管理
前台服务通常用于用户或系统认为重要的任务,如播放音乐、位置跟踪或执行文件下载等。通知提醒用户这些可能影响设备性能和电池寿命的服务正在运行。这样,用户可以做出相应的管理决策,比如在不需要服务时将其关闭,以节省资源。