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

来源:互联网 发布:sony xz premium 知乎 编辑:程序博客网 时间:2024/06/09 16:10

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组件的通信和数据传输。

原创粉丝点击