您的位置:首页 > 其它

bindservice与使用监听器更新进度+观察者模式

2017-03-09 16:03 381 查看
startservice与启动service的控件不会有关联,如果想两者需要通信得使用bindservice,另外bindservice当启动service的控件被销毁后会导致service的销毁,所以要同时使用startservice与bindservice。

更新进度可以用broadcastreceiver来做,但是对于多线程下载,如果用广播这个系统级别的东西,势必会出问题,所以建议用监听器来做。

一、bindservice的使用:

http://blog.csdn.net/guolin_blog/article/details/11952435

首先新建service,自定义binder类,把binder对象返回

public class DownTestService extends Service {

private MyBinder myBinder = new MyBinder();

@Nullable
@Override
public IBinder onBind(Intent intent) {
//返回binder对象
return myBinder;
}

/**
* 在binder里执行下载暂停下载,获取service对象
*/
class MyBinder extends Binder {
//开始下载
public void startDownload() {
}
//暂停下载
public void stopDownload() {
}
//获取service对象
public DownTestService getService() {
return DownTestService.this;
}
}
}


然后在activity中新建ServiceConnection 对象,在onServiceConnected()中返回的binder中获取service对象,并且可以控制service的行为。

public class DownloadTestActivity extends AppCompatActivity {
private Button btnStartService = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download_test);
initView();
}
private void initView() {
btnStartService.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
//启动服务下载
case R.id.btnStartService:
Intent intent = new Intent(DownloadTestActivity.this, DownTestService.class);
intent.putExtra("url", downloadUrl1);
//先绑定服务后启动下载
startService(intent);
bindService(intent, conn, BIND_AUTO_CREATE);
}
}
//服务绑定成功后会调用onServiceConnected(),第三个参数即我们传回来的binder
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (DownTestService.MyBinder) service;
//绑定成功后开始下载
myBinder.startDownload();
//绑定成功之后获取service对象
downloadService = myBinder.getService();
}

@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
}


二、监听器模式

http://www.jianshu.com/p/d38818f643e4

首先监听谁就在谁里面写接口,把需要的数据传出去

public class DownTestService extends Service {

private GetProgressListener getProgressListener = null;

public interface GetProgressListener {
void onProgressChange(int progress);
}

public void setProgressChangeListener(GetProgressListener aGetProgressListener) {
getProgressListener = aGetProgressListener;
}

//在进度更新的位置调用接口的方法,把进度**传出去**到activity中

@Override
public void onProgress(long finished, long total, int progress) {
if(getProgressListener!=null){
getProgressListener.onProgressChange(progress);
}
}


然后在activity塞一个接口的实现,进行监听。

public class DownloadTestActivity extends AppCompatActivity {

downloadService.setProgressChangeListener(//downloadService是通过bindservice返回的binder对象来获取的。
new DownTestService.GetProgressListener() {
@Override
public void onProgressChange(int progress) {
pbService.setProgress(progress);//此处拿到监听器暴露出来的进度进行更新进度条。
}
});
}


最后给出系统自带的观察者模式

观察者模式传送门
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息