我是靠谱客的博主 光亮美女,最近开发中收集的这篇文章主要介绍android o android8.0 startforegroundservice startforegroundservice() did not then call service.star,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
解决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
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
启动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 o android8.0 startforegroundservice startforegroundservice() did not then call service.star的全部内容,希望文章能够帮你解决android o android8.0 startforegroundservice startforegroundservice() did not then call service.star所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复