android防止service多次执行onStartCommand
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相关推荐
- android 通过service 执行AlarmManager 自动更换壁纸
自动更换壁纸是通过服务在后台进行的,所以 新建一个类继承service服务 先附上详细的解析代码: package com.example.changebz; import java.io.IOExc ...
- Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护
本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context ↳an ...
- Android之Service
2019独角兽企业重金招聘Python工程师标准>>> 1.Service的种类 按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(Local) 该服务依附在主进程 ...
- Android中Service的使用
我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...
- 关于Android的Service知识点,你知道吗?
目录 学习Service相关知识点: 概述: Service生命周期: Service的基本用法: 服务. 问:达叔,今日工作累吗? 答:累啊,那么问你,你知道Android中的 Service(服务 ...
- android服务开启线程,android之service与intentService的不同
不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentServic ...
- 如何让android的service一直在后台运行
1. 把service和activity分开,让service开机启动.设置一个broadcast receiver接受开机信号, 使用RECEIVE_BOOT_COMPLETED的permissio ...
- android的service组件不被杀死
文章转载自:http://blog.csdn.net/mad1989/article/details/22492519 序言 最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台运 ...
- android中Service使用startService
一.什么是Service? Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即 ...
最新文章
- 在项目中使用Google Closure Compiler
- ImageNet的top-1终于上了90%,网友质疑:用额外数据集还不公开,让人怎么信服?...
- java实现注销登录
- CentOS 安装 VMware Tools 详细方法
- 计算机硬件的基本组成
- Source insight关联QT库函数
- 城市遥感动态监测管理系统
- xadsafe做暗刷_手把手教你如何去掉网吧广告之PUBWin2015_XADSAFE
- 获取url中的参数方法,避免#的干扰,删除url指定参数(vue hash模式 有#删除指定参数问题)
- NGUI_2.6.3_系列教程三
- 大数据之-Hadoop3.x_MapReduce_TextInputFormat---大数据之hadoop3.x工作笔记0107
- React 的开发成本太高了?
- iOS开发警告The image set name xxx is used by multiple image sets.
- Discuz 3.2x 的那些坑
- java json转excel_JSON转EXCEL代码( java)
- 百度云盘不限速下载大文件(2021-11亲测有效)
- 第一次马拉松(2013上海国际马拉松赛)
- Python回归分析五部曲(二)—多重线性回归
- 看完书就忘,怎么办?告诉你六种方法(转载)
- pass parameters to view(参数视图)