最近有个需求需求"开启前台服务,然后进行持续定位" 没有用过特此记录一下

之前用的都是Service

class SocketService : Service() {private var webSockethandler: WebSocketHandler? = nullprivate var pushObserve: Observer<String>? = nullprivate var taskLog: Int = 0private var isConnecting: Boolean = false//var msgType: String = ""// 发送消息标识var msgUuid: String = ""var msgRole: String = ""override fun onCreate() {super.onCreate()//单例模式变量赋值instance = this}override fun onBind(intent: Intent?): IBinder? {("Backserver init on onBind").loge("websocket")intent?.let {if (token.isNotBlank()) {userToken = token}}return MyBinder()}class MyBinder : Binder() {fun getMyService(): SocketService {return getInstance()}fun getSocketStatus() {getMyService().webSockethandler?.getStatus()}}override fun onDestroy() {super.onDestroy()"Backserver init on onDestroy".loge("websocket")pushObserve?.let {LiveEventBus.get(Constant.IN_DRIVER_TRIP, String::class.java).removeObserver(it)}webSockethandler?.close()}companion object {private lateinit var instance: SocketServicefun getInstance(): SocketService {return instance}}}

其实如果不使用Binder 可以直接传null

然后注册

 <service android:name=".SocketService"android:enabled="true"android:exported="true"/>

注册完就启动service

  // 使用binder 示例var myService: SocketService? = nullvar mServiceConnection: ServiceConnection? = nullprivate fun startService(context: Context, token: String) {if (mServiceConnection == null) {mServiceConnection = object : ServiceConnection {override fun onServiceConnected(name: ComponentName, service: IBinder) {myService = (service as SocketService.MyBinder).getMyService()"ServiceConnection  onServiceConnected:${name}".loge("websocket")}override fun onServiceDisconnected(name: ComponentName) {}}"socket BackService启动".loge("websocket")val intent = Intent(context, SocketService::class.java)intent.putExtra(USER_TOKEN, token)context.bindService(intent, mServiceConnection!!, Context.BIND_AUTO_CREATE)} else {"socket BackService启动 onBind".loge("websocket")myService?.reConnect(token)}}fun finishService(context: Context) {mServiceConnection?.let {context.unbindService(it)}}// 普通的val intent = Intent(context, SocketService::class.java)intent.putExtra(USER_TOKEN, token)startService(intent)

说完service

前台service 代码

只需要在里面添加Notification 调用

class LocationService : Service() {private var TAG: String = LocationService::class.java.getSimpleName()override fun onBind(intent: Intent?): IBinder? {Log.d(TAG, "onBind()")return null}override fun onCreate() {super.onCreate()Log.d(TAG, "onCreate()");}@RequiresApi(Build.VERSION_CODES.O)override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {Log.d(TAG, "onStartCommand()");var  notification =  setChannelAndNotification(this)startForeground(123, notification)return super.onStartCommand(intent, flags, startId)}//安卓8.0以上需要创建channelfun setChannelAndNotification(context: Context): Notification {//创建channelif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//通过一个唯一的channel ID ,对用户可见的channel name,通知重要程度importance level构建一个通知渠道。//可选的使用setDescription()指定用户在系统设置页面看到的关于通知的相关描述。//通过createNotificationChannel()注册通知渠道。//IMPORTANCE_DEFAULT: 默认notification importance,可以在任何地方显示,有声音。//IMPORTANCE_HIGH:可以在任何地方显示,有声音.//IMPORTANCE_LOW:可以在任何地方显示,没有声音.//IMPORTANCE_MAX:重要程度最高,可以在任何地方显示,有声音,可以在用户当前屏幕上显示通知,可以使用full screen intents.比如来电。//IMPORTANCE_MIN:无声音,不会出现在状态栏中。//IMPORTANCE_NONE:在任何地方都不会显示,被阻塞。//IMPORTANCE_UNSPECIFIED:表示用户没有表示重要性的值。这个值是为了持久的首选项,并且永远不应该与实际的通知相关联。val notificationManager =context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagerval channel = NotificationChannel(context.getString(R.string.channel_id),context.getString(R.string.notification_title),NotificationManager.IMPORTANCE_HIGH)notificationManager.createNotificationChannel(channel)}val builder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationCompat.Builder(context, context.getString(R.string.channel_id))} else {NotificationCompat.Builder(context)}//创建notificationreturn builder//设置下拉列表里的标题.setContentTitle("下拉列表中的Title") .setContentText(context.getString(R.string.notification_text))// 设置上下文内容.setContentText("要显示的内容") //设置状态栏内的小图标.setSmallIcon(R.drawable.ic_launcher)// 设置下拉列表中的图标(大图标).setLargeIcon(BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher))// 设置该通知发生的时间.setWhen(System.currentTimeMillis());//用户触摸时,自动关闭.setAutoCancel(false)//设置处于运行状态// .setOngoing(true) .build()}}

清单注册service

最后启动service

 var mMonitorService = Intent(this, LocationService::class.java)// Android 8.0使用startForegroundService在前台启动新服务if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){startForegroundService(mMonitorService);}else{startService(mMonitorService);}

最后使用的时候报错 Context.startForegroundService() did not then call Service.startForeground?

是忘记写startForeground()导致

参考地址 (四十二)Context.startForegroundService() did not then call Service.startForeground?_i加加的博客-CSDN博客

最后发现google推荐将service改为JobService 参考如下

Android8.0利用JobScheduler实现服务的运行

android启动Service和ForegroundService相关推荐

  1. android 启动service报错,Android小经验

    转载自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dc ...

  2. Android -- 启动Service并传递数据

    本文主要记录Activity传递数据到Service. 1.效果图 2.通过以上效果图,可以看出activity页面的数值改变,相应后台service输出的数值也跟着改变. 3.核心代码如下,看代码中 ...

  3. Android隐式(远程)启动Service

    Android启动service首先肯定可以的是: Intent intent = Intent(context, service.class); startService(intent); // b ...

  4. android启动服务的生命周期,android Service启动运行服务 生命周期

    Service Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉, 可以使用它开发如监控之类的程序. 一.步骤 ...

  5. Android使用Intent启动Service的Intent必须是显式的

    今天使用Intent来启动Service时,代码如下: //为 Intent设置Action属性 intent.setAction("com.hust.service");star ...

  6. Android Studio开发基础之启动Service,并通过从Activity向Service传递数据

    本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Service,并敲如下代码: package com.example.lhb.startservice;imp ...

  7. android 启动服务同时传递数据,Android Studio开发基础之起动Service,并通过从Activity向Service传递数据...

    Android Studio开发基础之启动Service,并通过从Activity向Service传递数据 本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Se ...

  8. Android Service: 启动service, 停止service

    [ 启动service ] 1. 定义Service类 2. 在manifest中注册 3. 在activity中启动 1. 定义Service类 @Override public IBinder o ...

  9. android启动服务的生命周期,Android Service的两种启动方式以及生命周期

    Service的两种启动方式: 1.startService 2.bindService 注意: .在Android 5.0之后google出于安全的角度禁止了隐式声明Intent来启动Service ...

最新文章

  1. NeurIPS2021 注意事项以及往年投稿、接受率回顾
  2. fatfree-f3小型php框架(二)
  3. Mycat高可用集群搭建
  4. python工资津贴的计算和排序-python sort、sorted高级排序技巧
  5. 使用反射操作Array类型
  6. 浅析低延迟直播协议设计:RTP/RTCP
  7. checkpoint_通过Main的Checkpoint Restore加快Java启动速度
  8. 轻松部署IE7(下),SMS2003系列之六
  9. Mac Nginx 配置 Tomcat 配置 jdk环境变量 Nginx部署服务遇到的坑(1)
  10. 阿里巴巴北京总部鸟瞰图曝光:今天又是想去阿里上班的一天!
  11. JAVA怎么在函数内改变传入的值
  12. 【安全狗高危安全通告】2月“微软补丁日” 发布多个高危漏洞
  13. word页眉前后不一致怎么设置_如何设置页眉部分内容前后不同,页脚部分内容也前后不同的WORD文档?...
  14. 免费数据库应用程序工具 - 不需代码
  15. 仿迅雷播放器遇到的字符串处理函数
  16. 文件夹无法访问如何解决?
  17. List集合FindAll()方法使用案例
  18. 分享一个直接加QQ好友的链接或会话的
  19. 使用WebMagic+ActiveMQ+Quartz实现全国城镇天气自动更新的API接口开发
  20. jmeter三种阶梯式加压(逐渐加压)

热门文章

  1. ISCC 2017 部分解题记录 By Assassin
  2. emwin绘制背景的方法
  3. 体素二值膨胀求解采样空间 binary voxel dilation in 3D space
  4. sumo入门-保姆级教程
  5. java中的repaint_java 中paint .repaint.update
  6. 地址栏图标更换即shortcut icon问题
  7. oracle tabe unlock_Oracle中用户的创建和权限设置
  8. #1024#番外篇科普为什么1024是程序员日?2020年10月24日,程序员为啥都不放假?
  9. 神策军丨那个在神策跨城转岗的小伙子,现在怎么样了?
  10. ffmpeg之音频转码及重采样