service作为Android四大组件之一,我们会经常使用它。
service的启动方式有两种
1)使用Context.startService(Intent)启动
2)通过bindService启动(该方式service的生命周期跟activity的生命周期相关联)

需要注意的是:
service的onCreate只会执行一次,onBind也只会执行一次,onStartCommand可以执行多次

也就是说一旦service创建过了,而又没有被销毁的话,不管是再次调用bindService还是startService都不会再走onCreate, onBind也只会执行一次,多次调用startService会多次执行onstartCommand。

我们可以通过打印日志来看一下:
图片看不清楚的话可以把图片直接拉到一个新窗口看。

那么问题来了,在有些业务上比如版本更新之类的服务,我们一般是通过startService的方式来启动服务,因为下载是个耗时操作,我们不希望跟activity的生命周期绑定到一起。
下载的逻辑是在onStartCommand中实现的,如果多次调用onStartCommand很可能会出现问题,那么我们就只希望服务启动后只走一次onStartCommand。

解决思路:
我们可以直接判断service是否正在运行,如果正在运行,就不再startService

    /*** 判断服务是否运行*/private boolean isServiceRunning(final String className) {ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningServiceInfo> info = activityManager.getRunningServices(Integer.MAX_VALUE);if (info == null || info.size() == 0) return false;for (ActivityManager.RunningServiceInfo aInfo : info) {if (className.equals(aInfo.service.getClassName())) return true;}return false;}
     /*如果服务正在运行,直接return*/if (isServiceRunning("com.yzq.servicedemo.MyService")){Log.i("服务正在运行","return");return;}/*启动服务*/startServiceIntent = new Intent(this, MyService.class);startService(startServiceIntent);

来看看打印日志:
图片看不清楚的话可以把图片直接拉到一个新窗口看。


好了,下面是demo
ServiceDemo


如果你觉得本文对你有帮助,麻烦动动手指顶一下,算是对本文的一个认可,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

android防止service多次执行onStartCommand相关推荐

  1. android 通过service 执行AlarmManager 自动更换壁纸

    自动更换壁纸是通过服务在后台进行的,所以 新建一个类继承service服务 先附上详细的解析代码: package com.example.changebz; import java.io.IOExc ...

  2. Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context  ↳an ...

  3. Android之Service

    2019独角兽企业重金招聘Python工程师标准>>> 1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程 ...

  4. Android中Service的使用

    我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...

  5. 关于Android的Service知识点,你知道吗?

    目录 学习Service相关知识点: 概述: Service生命周期: Service的基本用法: 服务. 问:达叔,今日工作累吗? 答:累啊,那么问你,你知道Android中的 Service(服务 ...

  6. android服务开启线程,android之service与intentService的不同

    不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentServic ...

  7. 如何让android的service一直在后台运行

    1. 把service和activity分开,让service开机启动.设置一个broadcast receiver接受开机信号, 使用RECEIVE_BOOT_COMPLETED的permissio ...

  8. android的service组件不被杀死

    文章转载自:http://blog.csdn.net/mad1989/article/details/22492519 序言 最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台运 ...

  9. android中Service使用startService

    一.什么是Service?   Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即 ...

最新文章

  1. 有个程序员老公有多爽???
  2. javascript的匿名函数
  3. sklearn 归一化 和 标准化
  4. 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解
  5. 克鲁斯卡尔(Kruskal)算法求最小生成树
  6. (原创)C++11改进我们的程序之右值引用
  7. 数据结构--队列Queue--打印杨辉三角
  8. PostgreSQL体系结构之物理结构
  9. perl java远程调用函数调用_如何从Java调用Perl?
  10. 在taobao上安家了,欢迎大家来选购呀
  11. x265中checkMerge2Nx2N_rd0_4()分析(版本2.8)
  12. java用php退出清除session_PHP学习笔记:删除与销毁session
  13. 1T空间只是噱头而已! 网盘容量大战背后的技术秘密
  14. 进化树软件ete3报错记录
  15. 电容的字母型规格型号标号材料容差总结
  16. apache ii评分怎么评_APACHE II评分表
  17. 实战7:机器学习实战之 随机森林、逻辑回归、SVM算法方法进行垃圾邮件过滤分类 代码+数据
  18. Linux - 安装内核源码
  19. Python 书籍 搜索
  20. Win11新电脑开机怎么跳过登录microsoft账户?

热门文章

  1. 基于OBS如何实现毫秒级超低延时直播
  2. django+拉勾网招聘数据可视化
  3. printf函数的类型转换问题
  4. 你是什么时候从轻视到高看软件测试的?
  5. 中国式婚姻的10个错误观点(转载)
  6. jqury 获取第三个_使您的手机游戏成功。 第三部分:获取用户
  7. Vert.x(vertx)入门资料
  8. java语言基础-面向对象编程-方法(廖雪峰老师官网学习记录)
  9. 二进制原码、反码、补码及符号位进位
  10. 使用OpenSSL生成SSL证书的教程