bindservice
一、Service简介
Service(服务)是一种可以在后台执行长时间运行操作而没有用户界面的应用组件,是四大组件之一。
Service可以理解为没有专属界面(UI)的Activity。通过Service可以使程序在退出之后仍然能够对事件或用户操作做出反应,或者在后台继续运行某些程序功能。不同的是Activity拥有前台运行的用户界面,而Service不能自己运行,需要通过某个Activity或者其他context对象来调用。
Service是由其他Service,Activity或者Broadcast Receiver开始,停止和控制。
比如后台播放音乐,后台更新下载。
二、Service启动方式
1. 通过startService启动
用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。
这种模式的Service无法进行通信以及数据交换。
此处不详细介绍。
2. 通过bindservice启动
通过Context.bindService()方法启动服务,再通过Context.unbindService()关闭服务。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
在activity中通过transact发送数据,在service中通过onTransact获取数据并返回数据,实现通信以及交流。
三、bindService使用
1. 注册
<service Android:name=".MusicService" android:exported="true"/>
2. 继承Service类
(1)在service类中继承Binder类,并重写onTransact函数
onTransact函数就是接收activity(或者其他组件)发来的信息,code是判断是谁发来,目的是什么,这个可自由设计。data是传过来的数据,可以通过data.readString()等(类型有很多,也有data.readInt()…)来获得数据,如果你在传输数据的时候并没有写入相应的数据,比如你并没有writeInt,但却使用了readInt,那读出来的会是0(null)。**注意:你可以连续写入,再连续读取,但只能一一对应,写一次只能读一次,因此,如果你需要重复使用data.readString(),可以先存到一个临时变量,再用这个变量来进行你需要的操作。**reply是回传给activity的数据,原理与data一样。
public class MyBinder extends Binder {
@Override
protected boolean onTransact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags) throws RemoteException {
switch (code) {
//service solve
case 0:
reply.writeInt(1);
break;
//...
}
return super.onTransact(code, data, reply, flags);
}
}
(2)重写onBind函数
声明定义一个MyBinder对象,MyBinder就是前一步继承Binder的新类。并在onBinder中返回这个对象,之所以要返回这个,是因为要在activity中获得这个binder对象,然后利用这个来和service通信。
public final IBinder binder = new MyBinder();
@Override
public IBinder onBind(intent intent) {
return binder;
}
3. Activity中绑定使用
(1)获得service内的binder
在进行下面的操作之后,activity的binder并不能直接使用,还得继续绑定。
//在activity声明一个Binder对象,用来获取service里的binder
IBinder binder = new Binder();
//重写下面这个
private ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceConnected(componentname name, IBinder iBinder) {
binder = iBinder;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
(2)绑定
写在oncreat函数中,Intent第二个参数是你写的Service类名字,执行这两条语句,就创建了一个service,如果你在service的初始化了一些数据,比如进行音乐播放或下载,那在这一步就会开始。之后就可以通过通信来控制service。
//Activity启动时绑定Service:
Intent intent = new Intent(this, MyService.class);
bindService(intent, sc, BIND_AUTO_CREATE);
(3)通信、数据交换
在activity内使用transact发送数据,其中,注意int num = reply.readInt();
,只要调用了binder.transact(0, data, reply, 0);
,reply内马上就有了数据,这是在service里面写进去的。
注意:data和reply还是跟刚刚说的一样,写一次只能读一次,如果要重复使用,需要用一个临时变量来存数据。num在这里就是这个作用。
Parcel data = Parcel.obtain();
//你可以在这里用write写数据
data.writeString("test");//这样在service里就可以通过read来获取数据
Parcel reply = Parcel.obtain();
try {
binder.transact(0, data, reply, 0); //第一个参数可以随意改,只要在service有对应case就行
}catch (RemoteException e) {
e.printstacktrace();
}
int num = reply.readInt();
(4)解除绑定
unbindService(sc);
这样子我们就完成了如何启动activity以及在service和activity中通信的功能。
相关阅读
Web service服务(接口)一.定义Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用
(七十)Android O Service启动流程梳理——bindService
前言:最近在处理anr问题的时候迫切需要搞清楚service的启动流程,抽时间梳理一下。1.service启动简述service启动分三种,比较简单的就
DSCP(Differentiated Service Codepoint,差分服务代码
IP优先级方案可以粗略地将数据分为8个等级/类别,并还可以使用紧随优先级比特之后的4比特进一步的数据分类。当出现拥塞时,优先级低
解决nginx 503 Service Temporarily Unavailable
503 Service Temporarily Unavailable 最近网站刷新后经常出现503 Service Temporarily Unavailable错误,有时有可以,联想到最近在
Web service框架CXF最新版本:2.2.2开源服务框架,可以通过API,如JAX-WS,构建和开发服务。服务可以使多种协议的,例如SOAP, XML/HTTP, RE