Service(二) 前台服务ForeGround
在安卓9之后创建前台服务需要申请权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
创建前台服务的过程和之前创建后台服务的过程类似,只不过要在onCreate方法中加上一个方法:
startForeground()
具体设置过程如下:
Notification notification=new NotificationCompat
.Builder(MyService.this,"fdasf")
.setSmallIcon(R.drawable.ic_android_black_24dp)
.setContentTitle("this is a title")
.setContentText("this is a notification")
.build();
startForeground(1,notification);
其中第一个参数是id(不能为0),第二个参数是一个通知.
在notification的设置中,Builder的第二个参数不能是一个任意的字符串,否则会爆出Bad notification for startForeground的错误,必须要创建一个真实的channelId:
@Override public void onCreate() { ... createNotificationChannel(); Notification notification=new NotificationCompat .Builder(MyService.this,CHANNEL_ID) .setSmallIcon(R.drawable.ic_android_black_24dp) .setContentTitle("this is a title") .setContentText("this is a notification") .build(); startForeground(1,notification); } private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = "my notification channel"; int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } }
触摸通知以触发事件:
PendingIntent pendingIntent=PendingIntent.getActivity(
MyService.this,
0,
new Intent(MyService.this,MainActivity.class),
0
);
Notification notification=new NotificationCompat
.Builder(MyService.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_android_black_24dp)
.setContentTitle("this is a title")
.setContentText("this is a notification")
.setContentIntent(pendingIntent)
.build();
startForeground(1,notification);
在manifest中设置以保证一个activity只会被创建一次:
android:launchMode="singleInstance"