Android前台服务的特点主要包括以下几个方面:
- 持续运行任务:前台服务允许在后台执行长时间运行的任务,而不会受到系统对后台任务的限制。例如,播放音乐、下载文件、进行定位更新等任务可以在前台服务中执行,并且能持续运行,即使应用程序处于后台或设备锁定状态。
- 用户可见性:前台服务通过显示一个可见的通知,将正在执行的任务展示给用户。这样,用户可以清楚地知道应用程序正在进行某些重要操作,并且可以通过通知与应用程序进行交互。这提高了用户对应用程序的可见性和控制权,让用户更好地理解和参与应用程序的运行。
- 状态栏通知:前台服务通常会在状态栏显示一个通知,表明应用正在运行,并且用户可以随时看到。这个通知可能包含有关服务当前状态的信息,如当前播放的音乐曲目或下载进度。
- 优先级较高:与后台服务相比,前台服务的优先级较高。这意味着在系统内存不足的情况下,前台服务更不容易被系统回收,从而保证了服务的稳定性和可靠性。
- 需要权限:前台服务需要特定的权限才能运行,例如FOREGROUND_SERVICE权限。这是为了确保应用程序在请求前台服务时具有足够的权限和合法性。
接下来我来讲述一下怎么申请添加一个前台Service
首先,你得有一个Service,它的添加的方式很简单,但是需要注意一个地方,高版本Android需要在代码中添加申请,同时也得在manifest文件中添加相应的权限
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
添加完毕后我们需要在Service中的onCreat方法中添加代码的申请,虽然不添加也可以正常显示,但是为了防止bug,还是添加好一点
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: ");
//申请前台服务
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ //判断版本
NotificationChannel channel = new NotificationChannel("channel_id","通知",notificationManager.IMPORTANCE_DEFAULT);
notificationManager.createNotificationChannel(channel);
}
//创建通知
Notification notification = new NotificationCompat.Builder(this, "channel_id")
.setSmallIcon(R.drawable.ic_android_black_24dp)
.setContentTitle("这是通知标题")
.setContentText("这是通知内容")
.setPriority(NotificationCompat.PRIORITY_DEFAULT) // Ensure priority is set
.build();
startForeground(1, notification);
}
这里链式调用的第四行代码是优先级设置
.setPriority(NotificationCompat.PRIORITY_DEFAULT) // Ensure priority is set
这里,PRIORITY_DEFAULT
是NotificationCompat
类中的一个静态常量,表示通知的默认优先级。
Android定义了几个不同的优先级级别,从最低到最高分别是:
PRIORITY_MIN
PRIORITY_LOW
PRIORITY_DEFAULT
PRIORITY_HIGH
PRIORITY_MAX
这些优先级级别影响通知在用户界面中的显示方式,例如在状态栏中的可见性、声音和振动等。例如,一个高优先级的通知(PRIORITY_HIGH
或PRIORITY_MAX
)可能会更吸引用户的注意,因为它可能会发出声音、振动,或者在状态栏中显示一个更明显的图标。
渠道ID(Channel ID)在Android通知系统中的作用非常重要,主要体现在以下几个方面:
-
通知分类管理:渠道ID用于标识和区分不同类型的通知。在Android 8.0(API级别26)及更高版本中,开发者可以根据通知的性质将其分配到不同的通知渠道。例如,一个应用可能有消息通知、促销通知、系统更新通知等,每种都可以配置为一个独立的通知渠道,并赋予一个唯一的渠道ID。
-
用户个性化设置:渠道ID使得用户能够针对每个通知渠道进行个性化设置。在Android系统设置中,用户可以访问专门的界面来管理应用的通知渠道。通过渠道ID,用户可以开启或关闭特定的通知渠道,也可以调整通知的行为,如声音、震动、显示在锁屏上等。这种个性化设置有助于用户更好地控制和管理通知,减少被无关紧要的通知打扰的情况。
-
通知重要性级别:渠道ID还与通知的重要性级别相关联。通过为每个通知渠道设置不同的重要性级别(如
IMPORTANCE_HIGH
、IMPORTANCE_DEFAULT
、IMPORTANCE_LOW
等),开发者可以决定通知的展示方式。高重要性的通知可能会以弹出窗口的形式出现,而低重要性的通知可能只在状态栏中静默展示。这有助于用户根据通知的重要性来分配注意力和资源。 -
提升用户体验:通过允许用户根据渠道ID来定制通知的行为和展示方式,Android系统提供了更好的用户体验。用户可以根据自己的需求和偏好来设置通知,从而更加高效地处理和管理通知。同时,通知渠道也为开发者提供了更多的灵活性,可以根据应用的特性和需求来配置通知的行为和展示方式。
-
系统一致性:通知渠道为所有应用程序提供了一个统一的界面和体验。通过使用渠道ID来标识和管理通知渠道,Android系统确保了用户在不同应用程序之间具有一致的通知管理体验。这有助于用户更好地理解如何管理不同应用的通知,并提升整体的用户满意度。
startForeground(1, notification);
这里的链式调用前面的1是整数id
在startForeground(int id, Notification notification)
方法中,整数ID(通常被称为notificationId
)是用于唯一标识前台服务关联的通知的。这个ID在多个方面都是有用的:
-
区分不同的通知:如果你的应用可能同时运行多个前台服务(虽然这通常不是推荐的做法),或者你可能希望在不同的上下文中显示不同的前台服务通知,那么你可以使用不同的
notificationId
来区分它们。 -
更新或取消通知:如果你需要更新或取消前台服务的通知(例如,当服务状态改变时),你可以使用相同的
notificationId
来执行这些操作。通过调用NotificationManager
的notify(int id, Notification notification)
方法,你可以更新一个已存在的通知。同样,通过调用cancel(int id)
或cancelAll()
方法,你可以取消一个或所有通知。 -
管理资源:在内部,Android系统可能会使用这个ID来管理通知的资源。虽然这不是开发者直接关心的,但知道这个ID在系统中是唯一的并且被用来识别特定的通知是有帮助的。
-
日志和调试:在开发和调试过程中,如果你需要跟踪或识别特定的通知,那么知道其
notificationId
可能是有用的。
好了就讲这么多,像音乐播放器那种可交互的前台服务,后面写.....