Android四大组件——Service

Service是可以长时间运行在后台的没有用户界面的组件(区别于Activity),运行与UI线程中(区别与Thread)。

1、Service的两种启动方式

(1)startService()

    创建服务类继承于Service,onBind()方法默认返回null就行;

    在AndroidManifest文件中配置Service组件;

    指定Intent并通过Context.startService(intent)方法启动Service服务;

    在需要停止服务的时候通过Context.stopService(intent);

(2)bindService()

    创建BindService服务端继承于Service,创建一个实现IBinder接口的实例对象并提供公共方法给客户端调用;

    在服务端中必须实现onBind()回调方法并返回创建的Binder对象实例;

    在客户端中实现,从onServiceConnected(ComponentName name, IBinder binder)回调方法中获取Service端Binder实例,并使用提供的方法调用服务端Service;

    client通过bindService (Intent service, ServiceConnection sc, int flags)方法将Service绑定到此Client上;

    当Client在恰当的生命周期(如onDestroy等)时,此时需要解绑之前已经绑定的Service,通过调用函数unbindService(ServiceConnection sc);

2、Service的生命周期

    (1)通过startService方式启动

            首次调用startService()时,依次回调 onCreate()、onStartCommand();

            再次调用startService()时,将只执行onStartCommand(),因为此时Service已经创建了,无需执行onCreate()回调。

            调用stopService()或者stopSelf()时,回调onDestroy();

PS:所以无论多少次调用startService,每个服务都只存在一个实例,只需要一次stopService()或stopSelf()即可将此Service终止,然后执行onDestroy()函数。

            与client调用组件的关系(Activity):通过startService方式启动的服务的生命周期与Activity的生命周期没有任何关系,Activity如果销毁了也不会杀死Service,只有当Activity调用stopService或者Service本身调用stopSelf()才能停止此服务。(系统内存不足时也会kill掉Service)

    (2)通过bindService方式启动

            首次进行bindService()绑定时,依次回调onCreate()、onBind()、onServiceConnected();

            再次进行bindService()绑定时,没有触发回调;

            调用unBindService()进行解绑时,依次回调onUnBind()、onDestroy();

            与client调用组件的关系(Activity):通过bindService方式启动的服务的生命周期与Activity的生命周期有关系,只有当Activity被销毁了或者调用Context.unbindService才能停止Service服务,否则将一直在后台运行。(系统内存不足时也会kill掉Service)

3、Service与Activity的通信方式

    (1)startService方式启动

            当通过startService(Intent intent)方式启动的Service,Activity可以把Intent参数传递给Service,如果此时Service需要把Intent参数传递给Activity,只能通过发送广播的形式(Activity需要注册广播)

    (2)bindService方式启动

            可以通过Binder对象(统一进程)或者Messenger信使(跨进程)进行通信。


PS:关于onBind()的说明:onBind()是Service类中唯一的抽象方法,必须由子类实现,其返回值只对通过bindService方式启动的Service才有用,在startService方式中默认返回null就行。

PS:onStartCommand(Intent intent, int flags, int startId)的参数说明:flags参数默认下为0,可以指定以下常量:

START_NOT_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,即使系统内存足够可用,系统也不会尝试重新创建此Service。除非程序中Client明确再次调用startService()启动此Service。

START_STICKY:当Service因为内存不足而被系统kill后,接下来未来的某个时间内,当系统内存足够可用的情况下,系统将会尝试重新创建此Service,一旦创建成功后将回调onStartCommand()方法,但其中的Intent将是null。

START_REDELIVER_INTENT:与START_STICKY唯一不同的是,回调onStartCommand(...)方法时,其中的Intent将是非空,将是最后一次调用startService(...)中的intent。

PS:只有调用stopService才会回调onDestroy()方法。只有调用unbindService()才会回调onDestroy()方法。

PS:在bindService启动方式中,客户端的onServiceDisconnected()不会在onUnBind()执行后回调,只有放系统异常杀死Service时才会进行回调。

PS:BroadcastReceiver组件不能作为bindService()的client,因为BroadcastReceiver的生命周期很短,当执行完onReceive()回调时,BroadcastReceiver生命周期已经完结。而bindService又与Client本身的生命周期相关,因此Android中不允许BroadcastReceiver去bindService()。

补充:
因为Service运行在主线程,所以如果想要在Service执行耗时操作,必须创建子线程来执行耗时任务,但是由于Service服务需要手动调用stopService()去停止服务,操作起来比较麻烦,所以系统提供了IntentService来解决这个问题。IntentService继承于Service,同时封装了Handler和HandlerThread,重写onHandlerIntent()方法并在其中执行耗时任务即可,并且任务执行完毕后会自动调用stopSelf()停止服务,适用于完成一些短期的耗时任务。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容