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

来源:互联网 发布:苏州软件测试培训 编辑:程序博客网 时间:2024/05/22 13:38

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(),第三个参数即我们传回来的binderprivate ServiceConnection conn = new ServiceConnection() {        @Overridepublic 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);//此处拿到监听器暴露出来的进度进行更新进度条。                }            });}

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

0 0