必威体育Betway必威体育官网
当前位置:首页 > IT技术

Android开发(6):Service使用之bindService

时间:2019-08-11 04:14:21来源:IT技术作者:seo实验室小编阅读:70次「手机版」
 

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 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错误,有时有可以,联想到最近在

主流WebService框架

Web service框架CXF最新版本:2.2.2开源服务框架,可以通过API,如JAX-WS,构建和开发服务。服务可以使多种协议的,例如SOAP, XML/HTTP, RE

分享到:

栏目导航

推荐阅读

热门阅读