Android高版本后台开机检测自启动service(解决did not then call Service.startForeground())

非android工程师,单纯个人临时有需要,赶时间借鉴很多文章做出来的,单纯记录备忘下。原帖之一如下:

【错误记录】前台进程报错 ( Bad notification for startForeground invalid channel for service notification )_韩曙亮的博客-CSDN博客 

 1、新建一个Receiver,继承BroadcastRecevier类,用于开机广播,启动service服务。

/**
 * 接收开机广播来启动service
 */
public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, WebSocketService.class);
            // 判断版本
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (Settings.canDrawOverlays(context)) {
                    // 有悬浮框权限
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        context.startForegroundService(serviceIntent);
                    } else {
                        context.startService(serviceIntent);
                    }
                } else {
                    //没有悬浮框权限 要去索要悬浮框权限
                    System.out.println("没有悬浮框权限 要去索要悬浮框权限");
                }
            } else {
                //低版本不需要悬浮框权限 直接显示
                context.startService(serviceIntent);
                System.out.println("低版本不需要悬浮框权限 直接显示");
            }
        }
    }
}

2、在AndroidManifest.xml中配置如下:




        
        
            
                
                
            
        

 3、在service中的oncreated和onDestroy中添加如下:

    @Override
    public void onCreate() {
        super.onCreate();
        startForeground();
    }

    //关闭长连接
    @Override
    public void onDestroy() {
        super.onDestroy();
        stopForeground(true);
    }

    /**
     * 启动前台服务
     */
    private void startForeground() {
        String channelId = null;
        // 8.0 以上需要特殊处理
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            channelId = createNotificationChannel("kim.hsl", "ForegroundService");
        } else {
            channelId = "";
        }
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId);
        Notification notification = builder.setOngoing(true)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setPriority(PRIORITY_MIN)
                .setCategory(Notification.CATEGORY_SERVICE)
                .build();
        startForeground(1, notification);
    }

    /**
     * 创建通知通道
     * @param channelId
     * @param channelName
     * @return
     */
    @RequiresApi(Build.VERSION_CODES.O)
    private String createNotificationChannel(String channelId, String channelName){
        NotificationChannel chan = new NotificationChannel(channelId,
                channelName, NotificationManager.IMPORTANCE_NONE);
        chan.setLightColor(Color.BLUE);
        chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
        NotificationManager service = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        service.createNotificationChannel(chan);
        return channelId;
    }

你可能感兴趣的:(android,android)