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. 在项目中使用Google Closure Compiler
  2. ImageNet的top-1终于上了90%,网友质疑:用额外数据集还不公开,让人怎么信服?...
  3. java实现注销登录
  4. CentOS 安装 VMware Tools 详细方法
  5. 计算机硬件的基本组成
  6. Source insight关联QT库函数
  7. 城市遥感动态监测管理系统
  8. xadsafe做暗刷_手把手教你如何去掉网吧广告之PUBWin2015_XADSAFE
  9. 获取url中的参数方法,避免#的干扰,删除url指定参数(vue hash模式 有#删除指定参数问题)
  10. NGUI_2.6.3_系列教程三
  11. 大数据之-Hadoop3.x_MapReduce_TextInputFormat---大数据之hadoop3.x工作笔记0107
  12. React 的开发成本太高了?
  13. iOS开发警告The image set name xxx is used by multiple image sets.
  14. Discuz 3.2x 的那些坑
  15. java json转excel_JSON转EXCEL代码( java)
  16. 百度云盘不限速下载大文件(2021-11亲测有效)
  17. 第一次马拉松(2013上海国际马拉松赛)
  18. Python回归分析五部曲(二)—多重线性回归
  19. 看完书就忘,怎么办?告诉你六种方法(转载)
  20. pass parameters to view(参数视图)

热门文章

  1. 【jsp中c标签的使用以及获取数据】
  2. 直播or短视频,你更倾向于哪个?
  3. 基于Verilog的SPI接口设计
  4. 2021年高压电工复审考试及高压电工
  5. 李莫愁:耐得住寂寞才能守得住繁华(转自微信)
  6. 定理在数学中的简写形式_这些鲜为人知的数学定理,颠覆你的认知!
  7. 带你了解银行春招那些事~
  8. 一文让你彻底搞懂浏览器的渲染流程
  9. css 边框太粗_CSS如何怎么设置div边框颜色宽度和高度
  10. android如何终止一个正在运行的子线程