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

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

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

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

java 复制代码
/**
 * 接收开机广播来启动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中配置如下:

java 复制代码
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><!-- 接收广播 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><!-- 悬浮窗权限 -->
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
java 复制代码
        <!-- 广播 -->
        <receiver
            android:name=".Receiver.BootReceiver"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.HOME" />
            </intent-filter>
        </receiver>

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

java 复制代码
    @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;
    }
相关推荐
Just_Paranoid3 小时前
【Settings】恢复出厂设置密码校验
android·python·settings·sha256·hmac-sha256
肥肥呀呀呀5 小时前
flutter配置Android gradle kts 8.0 的打包名称
android·flutter
平生不喜凡桃李8 小时前
C++ 异常
android·java·c++
Propeller9 小时前
【Android】View 交互的事件处理机制
android·java
吴Wu涛涛涛涛涛Tao9 小时前
Flutter 实现「可拖拽评论面板 + 回复输入框 + @高亮」的完整方案
android·flutter·ios
雨声不在9 小时前
使用android studio分析cpu开销
android·ide·android studio
程序leo源10 小时前
Linux_基础指令(二)
android·linux·运维·服务器·青少年编程
雨白13 小时前
Android 两种拖拽 API 详解:ViewDragHelper 和 OnDragListener 的原理与区别
android
元亓亓亓13 小时前
JavaWeb--day3--Ajax&Element&路由&打包部署
android·ajax·okhttp