现在的位置: 首页 > 综合 > 正文

android音乐播放器Service的生命周期分析

2012年08月04日 ⁄ 综合 ⁄ 共 1957字 ⁄ 字号 评论关闭

在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系统自己发现是一个空服务,就把他销毁了,有谁知道原因是什么,希望大家告诉我下,谢谢!

抱歉!评论已关闭.