在android音乐播放器的源码中,启动播放Service的源码先使用了startService, 然后又使用了bindService, 代码如下:

public static ServiceToken bindToService(Activity context, ServiceConnection callback) {        Activity realActivity = context.getParent();        if (realActivity == null) {            realActivity = context;        }        ContextWrapper cw = new ContextWrapper(realActivity);        cw.startService(new Intent(cw, MediaPlaybackService.class));        ServiceBinder sb = new ServiceBinder(callback);        if (cw.bindService((new Intent()).setClass(cw, MediaPlaybackService.class), sb, 0)) {            sConnectionMap.put(cw, sb);            return new ServiceToken(cw);        }        Log.e("Music", "Failed to bind to service");        return null;    }

使用startService可以保证在音乐播放Activity退出后播放音乐的服务仍继续运行,而bindService则保证了Activity能够和Service进行交互。

1. 使用startService启动服务的生命周期方法:

使用这种方法启动一个Service,在Service启动后该Service和启动该Service的Activity就没有关系了。但是这种发放启动的Service不能和Activity进行交互。

通常情况下使用startService调用的Service生命周期方法为:onCreate()->onStartCommand()。

其中多次调用startService只调用一次onCreate(), 但可以多次调用onStartCommand().

当服务需要退出时,调用stopService,就会调用Service的onDestroy()方法。

2.使用bindService启动服务的生命周期方法:

使用这种方法启动的Service是和调用者Activtiy同生命的,当Activtiy退出时,服务也同时销毁了。这种方法启动的Service能够和Activity进行交互。

调用bindService启动服务,Service生命周期方法为:onCreate()->onBind()

多次调用bindService并不会多次调用onBind(), 即onCreate()和onBind()都是只被调用一次。

当Activity退出是,该Service销毁,调用:onUnbind()->onDestroy();

3. 综合以上两点,在音乐播放器的源码中先调用startService再调用bindService()调用的Service生命周期方法顺序为:

onCreate()->onStartCommand()->onBind().

此时如果没有播放音乐,就退出Activity,调用的方法为:

onUnbind()->onDestroy();

如果第一次启动音乐播放器后播放了一首音乐,在播放的过程中退出Activity, 此时调用的方法为:

onUnbind();

这种情况下只是解除了Activity与Service之间的绑定,Service仍再后台运行继续播放音乐。

此时再运行播放器程序,调用的方法为:

onStartCommand()->onRebind();

这里调用onStartCommand()容易理解,调用onRebind()的原因是在onUnbind()发放中返回了true, 返回true表示当服务再次被绑定时调用服务的onRebind()方法。

此时停止播放,并退出播放器程序,调用的方法为:

onUnbind();

此方法是马上调用的,系统并没有马上调用Service的onDestroy()方法,但是过了大约1分钟后又调用了Service的onDestroy()方法。从设置中查看正在运行的服务也可以验证这一点,在音乐播放器在无播放状态下退出后,刚开始音乐播放器服务仍然存在,大概1分钟后该服务就不存在了。这点是为什么我也没有弄明白,为什么在onUnbind()之后没有马上调用onDestroy(),而是在过了一段时间之后才调用onDestroy(), 难道是android系统自己发现是一个空服务,就把他销毁了,有谁知道原因是什么,希望大家告诉我下,谢谢!

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android(安卓)with the NDK_001
  5. Android:Deprecated Thread methods are not supported
  6. Android(安卓)7.0 SystemUI(1)--启动过程
  7. Android启动画面实现
  8. Android安装卸载程序具体操作方法解析
  9. 编译android源码6---运行android编译源码

随机推荐

  1. ARouter使用及源码简析
  2. 解决 Could not resolve com.android.too
  3. ArcGIS for Android(安卓)临时图层绘制文
  4. android通过JNI控制GPIO
  5. libgdx的使用--环境搭建测试
  6. cocos2d-x 3.0 android mk文件 之 自动遍
  7. Android(安卓)利用Gson生成或解析json
  8. 【Android】项目常用功能集锦(一)
  9. Android(安卓)Thread第二次Thread.start(
  10. AndroidDevTools