Service(服务)
Service(服务)
梦想家Peng 发表于2年前
Service(服务)
  • 发表于 2年前
  • 阅读 7
  • 收藏 0
  • 点赞 1
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

Service(服务)

---------------------------------

Service是Android系统的核心组件,由Android创建、维护和管理。

Service需要在AndroidManifest.xml文件中注册。

开发者所开发的所有Service都需要继承自android.app.Service类。

Service是没有界面的,适用于在后台(表示看不见)执行耗时任务。

尽管Service适合用于执行耗时任务,但是,Service仍然是运行在主线程的,所以,当执行任务时,应该开启子线程来完成。

Service是单例的。

开发Service的步骤

---------------------------------

1. 自定义类继承android.app.Service,由于Service是抽象的,所以,实现继承关系后,自定义的类需要重写抽象方法onBind(),目前,无视该方法,仅保证该方法存在即可

2. 打开AndroidManifest.xml文件,在<application>节点之下,添加<service>节点(与<activity>节点同级,且不区分先后顺序),并且至少配置<service>节点的android:name属性,该属性的值为自定义的Service类的完整名称,即包名+类名,例如cn.tedu.app.SampleService

启动Service

---------------------------------

在任何ContextWrapper的子类(例如Activity)中,调用startService(Intent intent)方法,即可激活Service组件


关闭Service

---------------------------------

方法1:在任何ContextWrapper的子类中,调用stopService(Intent intent)方法,即可关闭/停止Service

方法2:在Service内部,调用stopSelf()方法关闭自身


Service的生命周期

---------------------------------

onCreate():当Service组件被创建(第1次激活)时调用,反复激活同一个Service组件并不会重复调用该方法

onStartCommand():当Service组件被激活时调用,每次激活都会调用该方法,在第1次激活时,该方法将在onCreate()之后执行

onDestroy():当Service组件被销毁时调用


Service的粘性

---------------------------------

Service的粘性表现为:当Service被意外销毁时,会自动重新启动Service

Service的粘性是通过onStartCommand()方法的返回值确定的,该返回值的取值可以有:

a) START_STICKY:粘性的

b) START_NOT_STICKY:非粘性的

c) START_STICKY_COMPATIBILITY:兼容模式下的粘性的

d) START_REDELIVER_INTENT:粘性的,且在自动重新启动Service时会携带原来激活Service的Intent对象


绑定模式的Service

----------------------------

通过startService()激活的Service,称之为“启动模式”的Service

绑定模式的Service可以实现让其它组件(例如Activity)绑定到Service上,并且可以调用Service的方法,从而实现组件间的通信

开发步骤:

1) 创建Service,并注册

2) 重写Service中的onBind()方法,并确保该方法的返回值不为null,该返回值的类型是IBinder,推荐自定义类继承Binder来实现

3) 在其它组件(例如Activity)中,调用bindService()方法绑定到Service,该方法需要3个参数,第1个参数Intent用于配置需要被绑定的Service组件,第2个参数ServiceConnection是接口,需要自定义实现类并创建对象,第3个参数表示标识,使用常量BIND_AUTO_CREATE

4) 在Activity的onDestroy()方法中,调用unbindService()方法取消绑定,该方法的参数即为此前bindService()时的第2个参数

绑定模式的Service的生命周期

----------------------------

1. onCraete()

2. onBind()

3. onUnbind()

4. onDestroy()


绑定的Service

【作用】

绑定的Service用于实现进程间通信的。

【组件间通信开发流程】

1. 自定义Service,注册

2. 自定义接口,用于约定Activity需要调用Service来执行的方法

3.1 [Service] 自定义内部类,继承Binder,并实现上述接口

3.2 [Service] 重写onBind(),将内部类的对象作为返回值

4.1 [Activity] 自定义内部类,实现ServiceConnection

4.2 [Activity] 在需要绑定Service时,调用bindService()方法实现绑定

4.3 [Activity] 在内部类的onServiceConnected()方法中,将参数IBinder service强制转换为第2条步骤的接口类型,则可以调用Service中的方法

4.4 [Activity] 在onDestroy()方法中,调用unbind()方法解除与Service的绑定,该语句应该在super.onDestroy()之前调用


Intent intent = new Intent(this, LocalService.class);
bindService
(intent, mConnection, Context.BIND_AUTO_CREATE);

【进程间通信的开发流程】

1. 在“服务端”,参考“组件间通信”,创建Service及必要的Service的处理

2. 在“客户端”准备访问“服务端”的Activity及界面的初始化等

3. 为“服务端”的Service配置intent-filter,使得该Service可以被其它应用程序激活

4. 将“服务端”原有的IMusicPlayer.java接口修改为AIDL接口

5. 将“服务端”的Service中的内部类(InnerBinder)修改为直接继承自IMusicPlayer.Stub

6. 在“客户端”创建“服务端”的AIDL文件的包名,并把“服务端”的aidl文件复制到“客户端”

7. 在“客户端”,在InnerServiceConnection的onServiceConnected()方法中,通过IMusicPlayer.Stub.asInterface()方法获取IMusicPlayer的对象


共有 人打赏支持
粉丝 0
博文 33
码字总数 15605
×
梦想家Peng
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: