android o android8.0 startforegroundservice startforegroundservice() did not then call service.star
16lz
2021-01-26
解决context.startforegroundservice() did not then call service.startforeground()
原因:
- Android 8.0 系统不允许后台应用创建后台服务,故只能使用
Context.startForegroundService()
启动服务 - 创建服务后,应用必须在5秒内调用该服务的
startForeground()
显示一条可见通知,声明有服务在挂着,不然系统会停止服务 + ANR 套餐送上。 - Notification 要加 Channel,系统的要求。
解决步骤:
Service.java 中
@Override public void onCreate() { super.onCreate(); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { startFG(); } } private void startFG() { NotificationBuilder builder = new NotificationBuilder(this); final Notification notification = builder.buildNotification(); startForeground(NotificationBuilder.NOTIFICATION_ID, notification); }
NotificationBuilder.java
public final class NotificationBuilder { public static final String NOTIFICATION_CHANNEL_ID = "com.demo.CHANNEL_ID"; public static final int NOTIFICATION_ID = 0xD660; private final Context mContext; private final NotificationManager mNotificationManager; public NotificationBuilder(Context context) { mContext = context; mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); } public Notification buildNotification() { if (shouldCreateNowPlayingChannel()) { createNowPlayingChannel(); } NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID); return builder.setSmallIcon(R.drawable.all_app_takeaway_icon) .setContentTitle("") .setContentTitle("") .setOnlyAlertOnce(true) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .build(); } @RequiresApi(api = Build.VERSION_CODES.O) private boolean nowPlayingChannelExists() { return mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) != null; } private boolean shouldCreateNowPlayingChannel() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !nowPlayingChannelExists(); } @RequiresApi(api = Build.VERSION_CODES.O) private void createNowPlayingChannel() { final NotificationChannel channel = new NotificationChannel( NOTIFICATION_CHANNEL_ID, "当前播放", NotificationManager.IMPORTANCE_LOW); channel.setDescription("当前播放的电台"); mNotificationManager.createNotificationChannel(channel); }}
还要注意:
AndroidManifest.xml 中配置permission
启动Service方法:
//后台启动service if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { Intent serviceIntent = new Intent(this, DemoService.class); startForegroundService(serviceIntent); } else { Intent serviceIntent = new Intent(this, DemoService.class); startService(serviceIntent); }
更多相关文章
- Android运行Socket项目 Error: ShouldNotReachHere()
- Android(安卓)TextView显示html富文本格式以及Edittext获取带htm
- Android培训班(21)
- Android实现判断某个服务是否正在运行的方法
- Android(安卓)Studio下Intent隐式启动,发短信,拨号,打电话,访问网页
- android Activity关闭动画 附左右动画anim
- Android后台开启服务默默拍照
- 【安卓笔记】android客户端向tomcat服务器发送请求中文乱码问题
- Activity面试详解