服务的启动、停止和与活动的通信

服务作为安卓的四大组件之一,一般运行在程序后台,适合用于执行不需要与用户交互又需要长期运行的任务。本文主要记录服务的启动与停止以及服务与活动之间的通信。
(1)服务的启动与停止
首先实现一个MyService类继承自Service类,因为目前只需要实现启动与停止服务的功能,所以只是简单地重写几个常用的方法,其中第一个是抽象方法必须要重写,后面讲到服务与活动的通信时会用到,其他三个都是很常见的方法,为了了解服务的启动过程,在logcat中打印出执行过程。

public class MyService extends Service {
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService","onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService","onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("MyService","onDestroy");
    }
}

至此,服务类就定义完成了,既然服务是四大组件之一就需要在清单文件中注册:

<service android:name=".MyService"/>

接着需要在活动中启动服务,这里采用用两个按钮分别对应实现服务的启动与停止,然后设置单击事件,使用意图的方式实现活动的启动与停止,

public void onClick(View view){
        switch (view.getId()){
            case R.id.Button_Start:
                Intent startIntent = new Intent(this,MyService.class);
                startService(startIntent);
                break;
            case R.id.Button_Stop:
                Intent stopIntent = new Intent(this,MyService.class);
                stopService(stopIntent);
                break;
            default:
                break;
        }
    }

这样,就实现了第一个任务,服务的活动与启动:
这里写图片描述
这里写图片描述

(2)服务与活动的通信
服务启动后就默默地在后台运行着,显然如果活动能控制服务执行一些任务的话将使两者联系更加紧密,这就要借助刚才在MyService中的onBind()方法了。
首先讲下大致思路,为实现活动与服务的通信,也即是活动发出一条指令让服务执行下载,服务就去执行下载功能,发出指令同样可以采用启动服务的方式,通过点击一个按钮并设置单击事件来实现,同时用bindService()方法绑定服务和活动,这个方法接收三个参数(具体自己查,没啥难度的):

public void onClick(View view){
        switch (view.getId()){
            ...
            case R.id.Button_Bind:
                Intent bindIntent = new Intent(this,MyService.class);
                bindService(bindIntent,connection,BIND_AUTO_CREATE);
                break;
            case R.id.Button_Unbind:
                unbindService(connection);
                break;
            default:
                break;
        }
    }

其中第二个参数是ServiceConnection的实例,这里在活动中用一个匿名函数实现,ServiceConnection有两个方法onServiceConnected()和onServiceDisconnected()分别会在服务和活动绑定与解绑时执行,绑定时调用的两个方法就是活动要服务执行的两个功能,即开始下载和返回进度,而这两个功能则需要在MyService中预先定义的:

 private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("MainActivity","service connected");
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgerss();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("MainActivity","seivice disconnected");
        }
    };

MyService类中定义了上述两个方法:

public class MyService extends Service {

    private DownloadBinder downloadBinder = new DownloadBinder();
    ...
    class DownloadBinder extends Binder{
        public void startDownload(){
            Log.d("DownloadBinder","startDownload");
        }
        public void getProgerss(){
            Log.d("DownloadBinder","getProgress");
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return downloadBinder;
    }
}

这样通过点击按钮就实现了服务与活动通信的功能
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值