解决context.startforegroundservice() did not then call service.startforeground()

原因:

  1. Android 8.0 系统不允许后台应用创建后台服务,故只能使用Context.startForegroundService()启动服务
  2. 创建服务后,应用必须在5秒内调用该服务的 startForeground() 显示一条可见通知,声明有服务在挂着,不然系统会停止服务 + ANR 套餐送上。
  3. 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);        }

 

 

 

更多相关文章

  1. Android运行Socket项目 Error: ShouldNotReachHere()
  2. Android(安卓)TextView显示html富文本格式以及Edittext获取带htm
  3. Android培训班(21)
  4. Android实现判断某个服务是否正在运行的方法
  5. Android(安卓)Studio下Intent隐式启动,发短信,拨号,打电话,访问网页
  6. android Activity关闭动画 附左右动画anim
  7. Android后台开启服务默默拍照
  8. 【安卓笔记】android客户端向tomcat服务器发送请求中文乱码问题
  9. Activity面试详解

随机推荐

  1. H5页面调用android方法传json格式
  2. 【android】7、五大存储
  3. android 修改标题栏文字居中
  4. Android(安卓)adb shell 命令大全
  5. android textview 显示表情和文字 表情带
  6. Android IPC进程通信——Messager方式
  7. Android 学习笔记7---数据存储与访问
  8. Android入门:单元测试
  9. Android 记住listView的位置
  10. Ubuntu连接Android真机调试