您的位置:首页 > 移动开发 > Android开发

android 活动与服务进行通讯(服务(Service)一)

2016-06-19 17:31 513 查看
虽然服务是在活动里启动的,但是在启动了服务之后 ,活动与服务基本就没有什么关系了。确实如此,开始服务,之后服务会一直处于运行状态,但具体运行的是什么逻辑,活动就控制不了了。那有什么办法可以让活动跟服务的关系更紧密一些呢?

不知你们有没有发现,每创建一个服务的时候,工具都会自动帮你实现一个onBind(Intent intent)方法

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


我们主要是利用这个方法实现与活动的通讯。开始,我们不要求与活动通讯的时候,这个方法返回值是null的。我们再我们创建的服务类中,创建一个内部类,继承Binder ,下面我随便在该类中写两个打印的方法:
class MyBinder extends Binder {
public void startDownload() {
Log.d("MyService", "startDownload executed");
}
public int getProgress() {
Log.d("MyService", "getProgress executed");
return 0;
}
}


在我们刚刚的onBinder();方法中把这个类返回:
private MyBinder mBinder = new MyBinder ();

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


可以看到,这里我们新建了一个MyBinder类,并让它继承自 Binder,然后在它的内部提供了开始下载以及查看下载进度的方法。当然这只是两个模拟方法,并没有实现真正的功能,我们在这两个方法中分别打印了一行日志。接着,在
服务中创建了 MyBinder的实例,然后在 onBind()方法里返回了这个实例,这样 服务中的工作就全部完成了。

然后就在活动(activity)中创建了一个 ServiceConnection 的匿名类,在里面重写了onServiceConnected()方法和 onServiceDisconnected()方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用。在 onServiceConnected()方法中,我们又通过向下转型得到了
MyBinder的实例,有了这个实例,活动和服务之间的关系就变得非常紧密了。现在我们可以在活动中根据具体的场景来调用
MyBinder中的任何 public 方法,即实现了指挥服务干什么,服务就去干什么的功能。这里仍然只是做了个简单的测试,在onServiceConnected()方法中调用了
MyBinder的 startDownload()和 getProgress()方法。

private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
downloadBinder = (MyService.DownloadBinder) service;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
};


通过活动绑定服务

Intent bindIntent = new Intent(this, MyService.class);

bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务

然后如果我们想解除活动和服务之间的绑定该怎么办呢?调用一下 unbindService()方法就可以了。

unbindService(connection); // 解绑服务

其实这样就可以简单的与活动进行通讯了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: