1.Android6.0 以下版本可以这么用,在Service的onCreate方法中
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this, SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher)
.setContentText("message")
.setContentTitle("title")
.setContentIntent(pendingIntent);
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// manager.notify(1, notification);
startForeground(1,notification);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
使用notification ,区别是用startForeground方法,这样打开的notification常驻状态栏(除非进程或者该服务被杀死)。
打开一个不在状态栏显示的notification , 第一个参数id为0即可 : startForeground(0, new Notification());
要从前台删除服务,需调用stopForeground()方法,需要一个布尔型参数,但是这个方法不终止服务。
如果该进程或者该服务被杀死,状态栏的notification也会消失。
2.Android8.0 及以上版本可以这么用,在Service的onCreate方法中
public class MyService extends Service {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onCreate() {
super.onCreate();
Intent intent = new Intent(this, SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
String channelID = "1";
String channelName = "channel_name";
NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher)
.setContentText("message")
.setContentTitle("title")
.setChannelId(channelID)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
Notification notification = builder.build();
manager.notify(1, notification);
// startForeground(1,notification);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
代码和之前版本相比多了一个channelID 参数,Android 8.0 必须要有的,否则notification无法显示。
Android 8.0 后台应用想启动服务就老老实实的加个notification给用户看,表示你自己在后台占着资源,杀不杀由用户决定,偷偷地在后台跑没有framework帮忙想都别想,会导致 anr+crash。
1)activity: Context.startForegroundService()
2)Service:startForeground(int id, Notification notification)(id must not be 0,notification must not be null)。
想要变成前台服务:启动服务要使用startForegroundService方法,然后必须要在5秒内调用startForeground方法,而且参数(id!=0&¬ification!=null),否则导致 anr+crash。
Android8.0 需要设置通知栏,使服务变成前台服务。
但是在 Android9.0 就会出现Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE
。如果是启动前台服务的话 还需要一个权限 android.permission.FOREGROUND_SERVICE