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

    xiaoxiao2021-03-25  125

    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);//此处拿到监听器暴露出来的进度进行更新进度条。 } }); }

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

    转载请注明原文地址: https://ju.6miu.com/read-13400.html

    最新回复(0)