赞
踩
非android工程师,单纯个人临时有需要,赶时间借鉴很多文章做出来的,单纯记录备忘下。原帖之一如下:
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中配置如下:
- <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" />
- <!-- 广播 -->
- <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中添加如下:
- @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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。