【Android】四大核心应用程序组件之 Service (待续)

目录

 

1. Service的基本概念

2. 如何实现一个Service

3. IntentService

4. Bind Service

5. Messenger


1. Service的基本概念

Service是 android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟 Activity 的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互。service 可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他 Activity 这个时候程序要在后台继续播放,比如检测 SD 卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后台的。

 

2. 如何实现一个Service

2.1  创建一个类继承 andorid.app.Service 类,实现抽象方法,重写onStartCommand和onDestory方法

onStartCommand方法中,写一些实现服务的核心业务代码。由于 startService 默认使用线程是主线程(main)。若业务需消耗较长时间,则使用新线程去完成。

onStartCommand使用时,返回的是一个(int)整型。
这个整型可以有四个返回值:
start_sticky、start_no_sticky、START_REDELIVER_INTENT、START_STICKY_COMPATIBILITY。

1):START_STICKY:“粘性的”。如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
2):START_NOT_STICKY:“非粘牲的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
3):START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
4):START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

onDestroy方法是用来销毁Service

2.2  在AndroidMainfest.xml中配置Service

       android: exported 是否在外部能够使用

       android: enabled 是否有效


3. IntentService

(通常用于只做一次的任务:下载)

IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandlelntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类椎。

 

4. Bind Service

应用程序组件(客户端)通过调用bindService()方法能够绑定服务,然后Android系统会调用服务的onBind()回调方法,这个方法会返回一个跟服务端交互的IBinder对象。这个绑定是异步的,bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。

ServiceConnection对象包含了一个系统调用的传递IBinder对象的回调方法。

注意:只有Activity、Service、和内容提供器(content provider)能够绑定服务--对于广播接收器不能绑定服务。


5. Messenger

实现IPC通信,底层也是使用了AlDL方式。和AlDL方式不同的是,Messenger方式是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的,支持并发处理,因此,我们使用AIDL方式时需要保证代码的线程安全。
大部分情况下,我们应用中不需要并发处理。因此,我们通常只需要使用Messenger方式。
思想:在进程A中创建一个Message,将这个Message对象通过Messenger.send(message)方法传递到进程B(当然,Message对象本身是无法被传递到进程B的,send(message)方法会使用一个Parcel对象对Message对象编集,再将Parcel对象传递到进程B中,然后解编集,得到一个和进程A中Message对象内容一样的对象),再把Message对象加入到进程B的消息队列里,Handler会去处理它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值