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

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

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

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

android防止service多次执行onStartCommand_第1张图片

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

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

    /**     * 判断服务是否运行     */    private boolean isServiceRunning(final String className) {        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);        List 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);

来看看打印日志:
图片看不清楚的话可以把图片直接拉到一个新窗口看。
android防止service多次执行onStartCommand_第2张图片


好了,下面是demo
ServiceDemo


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

更多相关文章

  1. Android 三种sendBroadCast的方式对比
  2. Android 控件ImageView图片框
  3. android异步加载图片显示,并且对图片进行缓存实例
  4. Android 锁屏生命周期问题
  5. Android显示网络图片实例
  6. Android三种方式获取SharedPreferences
  7. 今天开始写android的照片浏览器(一)至返回所有图片文件
  8. 删除androidAndroid递归方式删除某文件夹下的所有文件
  9. 3.NDK Android jni开发 C语言中打印log debug模式下 (相机图片美

随机推荐

  1. Android(安卓)Okhttp 断点续传面试解析
  2. 【Android】利用Fiddler进行抓包详解教程
  3. 浅谈Android中的线程的通信及Handle机制
  4. Android中可以做的两件坏事---破解锁屏密
  5. Android实训案例(二)——Android下的CMD
  6. Android(安卓)系统分析[1]
  7. iOS 与 Android(安卓)之战,乔布斯是否正在
  8. Android(安卓)自定义动画 单个View平面位
  9. 如何学习Android及如何利用android来赚钱
  10. [置顶] 随了Android的大流,站入Google阵营