参考网址:https://blog.csdn.net/yt_42370304/article/details/105842170
https://blog.csdn.net/sinat_20059415/article/details/80584487
https://blog.csdn.net/luo_boke/article/details/102696097
Android8.0后不再允许后台service直接通过startService方式去启动
启动方式
Intent intent = new Intent(this, MyService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent);
} else {
startService(intent);
}
MyService
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
//创建NotificationChannel
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel = new NotificationChannel(NOTIFICATION_ID,
NOTIFICATION_NAME, NotificationManager.IMPORTANCE_HIGH);
notificationManager.createNotificationChannel(channel);
}
//Android9.0会报Caused by: java.lang.SecurityException: Permission Denial:
//android.permission.FOREGROUND_SERVICE---AndroidManifest.xml中需要申请此权限
startForeground(1,getNotification());
}
//这个必须加,不能设置为null
private Notification getNotification() {
Notification.Builder builder = new Notification.Builder(this)
.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle("测试服务")
.setContentText("我正在运行");//标题和内容可以不加
//设置Notification的ChannelID,否则不能正常显示
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(NOTIFICATION_ID);
}
Notification notification = builder.build();
return notification;
}
}
说明:
测试发现Android8.0后如果用startService启动服务,应用退到后台后此服务一会儿就会被杀掉;如果用startForegroundService启动服务,并且添加了消息通知后,应用后台挂起则不会被系统杀掉