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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值