当前位置:   article > 正文

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

android查看自启服务

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

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

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

  1. /**
  2. * 接收开机广播来启动service
  3. */
  4. public class BootReceiver extends BroadcastReceiver {
  5. @Override
  6. public void onReceive(Context context, Intent intent) {
  7. if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
  8. Intent serviceIntent = new Intent(context, WebSocketService.class);
  9. // 判断版本
  10. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  11. if (Settings.canDrawOverlays(context)) {
  12. // 有悬浮框权限
  13. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  14. context.startForegroundService(serviceIntent);
  15. } else {
  16. context.startService(serviceIntent);
  17. }
  18. } else {
  19. //没有悬浮框权限 要去索要悬浮框权限
  20. System.out.println("没有悬浮框权限 要去索要悬浮框权限");
  21. }
  22. } else {
  23. //低版本不需要悬浮框权限 直接显示
  24. context.startService(serviceIntent);
  25. System.out.println("低版本不需要悬浮框权限 直接显示");
  26. }
  27. }
  28. }
  29. }

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

  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><!-- 接收广播 -->
  2. <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  3. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /><!-- 悬浮窗权限 -->
  4. <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
  1. <!-- 广播 -->
  2. <receiver
  3. android:name=".Receiver.BootReceiver"
  4. android:exported="true">
  5. <intent-filter android:priority="1000">
  6. <action android:name="android.intent.action.BOOT_COMPLETED" />
  7. <category android:name="android.intent.category.HOME" />
  8. </intent-filter>
  9. </receiver>

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

  1. @Override
  2. public void onCreate() {
  3. super.onCreate();
  4. startForeground();
  5. }
  6. //关闭长连接
  7. @Override
  8. public void onDestroy() {
  9. super.onDestroy();
  10. stopForeground(true);
  11. }
  12. /**
  13. * 启动前台服务
  14. */
  15. private void startForeground() {
  16. String channelId = null;
  17. // 8.0 以上需要特殊处理
  18. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  19. channelId = createNotificationChannel("kim.hsl", "ForegroundService");
  20. } else {
  21. channelId = "";
  22. }
  23. NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId);
  24. Notification notification = builder.setOngoing(true)
  25. .setSmallIcon(R.mipmap.ic_launcher)
  26. .setPriority(PRIORITY_MIN)
  27. .setCategory(Notification.CATEGORY_SERVICE)
  28. .build();
  29. startForeground(1, notification);
  30. }
  31. /**
  32. * 创建通知通道
  33. * @param channelId
  34. * @param channelName
  35. * @return
  36. */
  37. @RequiresApi(Build.VERSION_CODES.O)
  38. private String createNotificationChannel(String channelId, String channelName){
  39. NotificationChannel chan = new NotificationChannel(channelId,
  40. channelName, NotificationManager.IMPORTANCE_NONE);
  41. chan.setLightColor(Color.BLUE);
  42. chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
  43. NotificationManager service = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  44. service.createNotificationChannel(chan);
  45. return channelId;
  46. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/464572
推荐阅读
相关标签
  

闽ICP备14008679号