Android小例子:Service组件的简单使用

时间:2021-10-23 05:30:03

Service组件和Activity组件一样都是可执行的程序,它也拥有自己的生命周期。开发Service和开发Activity的过程基本相似。开发一个Service组件一般需要两步:第一定义一个继承至Service类的子类;第二在AndroidManifest.xml文件中配置该Service。下面举两个小例子来说明一下Service组件的基本使用。(所有例程基于Android Studio开发)


一、Service基本操作实例

Service的基本操作包括:创建Service、配置Service、启动Service、停止Service。

1、实现一个MyService类让它继承自Service类,具体代码如下所示:

package cn.edu.syau.yl_app_service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;

/**
* Created by yule on 2017/5/24.
*/

public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
System.out.println("Service is created!");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("Service is started!");
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
super.onDestroy();
System.out.println("Service is Destroyed!");
}
}

在MyService类中重载了以下相关的方法:

onBind() : 该方法是Service类必须实现的方法,他会返回一个IBinder的对象,其他应用程序组件可以通过它与Service组件进行通信;

onCreate():Service第一次被创建时调用该方法

onStartCommand():客服端每次调用startService()时都会回调该方法

onDestroy():在Service关闭之前会回调该方法

2、在AndroidManifest.xml文件中配置该Service组件,具体如下:

 <service android:name=".MyService">
<intent-filter>
<action android:name="cn.edu.syau.yl_app_service.MyService"/>
</intent-filter>
</service>
3、在主Activity中设置两个按钮,分别用来启动Service和停止Service,具体实现如下:
 btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);

final Intent intent = new Intent();
intent.setAction("cn.edu.syau.yl_app_service.MyService");
intent.setPackage(getPackageName());

btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});

btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});


二、绑定本地Service并与之通信实例

通过startService()启动Service时,Service与访问者之间基本上不存在过多的联系,因此Service和访问者之间也无法进行通信和数据传输。但是通过使用bindService()就可以实现访问者与Service之间进行通信和数据传输。

1、重新定义MyService类,具体如下:

package cn.edu.syau.yl_app_service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

/**
* Created by yule on 2017/5/24.
*/

public class MyService extends Service {

private boolean quit = false;
private int count = 0;
private String serviceName = "cn.edu.syau.yl_app_service.MyService";
private MyBinder binder = new MyBinder();

/* 定义一个Binder类的子类,实现和其他组件进行通信 */
public class MyBinder extends Binder{
public int getCount(){
return count;
}

public String getServiceName(){
return serviceName;
}
}

@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind Service!");
return this.binder;
}

@Override
public boolean onUnbind(Intent intent) {
System.out.println("onUnBind Service!");
return super.onUnbind(intent);
}

@Override
public void onCreate() {
super.onCreate();
System.out.println("Service is created!");

/* 定义一个匿名线程 */
new Thread(){
@Override
public void run() {
while(!quit){
try {
Thread.sleep(1 * 1000);
count++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("Service is started!");
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onDestroy() {
super.onDestroy();
System.out.println("Service is Destroyed!");
this.quit = true;
}
}
重载了Service类当中的相关方法:

onBind():返回一个Binder实例对象给服务的访问者,通过这个Binder实例可以实现服务的访问者和Service组件之间进行通信

onCreate():在里面实现了以你匿名线程类,让它不停的执行对count的加一操作,知道服务的访问者解除对服务的绑定为止

通过集成Binder实现了一个MyBinder的子类,在这个类中实现了两个方法:

getCount():放回当前服务的count值

getServiceName():放回当前服务的名字

2、在主Activity中定义了三个按钮,一个用于绑定服务,一个用于解除服务的绑定,还有一个用于获取服务的相关信息(实现与服务组件的通信和数据传输),具体的实现如下:

 btnBind = (Button) findViewById(R.id.btnBind);
btnUnbind = (Button) findViewById(R.id.btnUnbind);
btnGetCount = (Button) findViewById(R.id.btnGetCount);

final Intent intent = new Intent();
intent.setAction("cn.edu.syau.yl_app_service.MyService");
intent.setPackage(getPackageName());

/* 绑定服务 */
btnBind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
}
});

/* 解除服务绑定 */
btnUnbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(serviceConnection);
}
});

/* 获得服务的count值 */
btnGetCount.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("Service name is " + binder.getServiceName());
System.out.println("Service count is " + binder.getCount());
}
});
在bindService()函数调用中传入了一个serviceConnection的参数,它是MyServiceConnection类的实例化对象,这个类的具体实现如下:

/* 定义一个ServiceConnection接口的子类 */
public class MyServiceConnection implements ServiceConnection{

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("onServiceConnected!");
binder = (MyService.MyBinder)service;
}

@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("onServiceDisconnected");
}
}
具体的过程是这样的:当访问者调用bindService()时会回调服务端的onBind()方法,这个方法会返回一个IBinder的实例化对象,访问者通过绑定服务时传入的ServiceConnection类的实例化对象的onServiceConnected()方法来获得IBinder实例化对象,进而实现和Service组件的通信和数据传输。