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
- bindservice与使用监听器更新进度+观察者模式
- Java监听器与观察者模式
- Android 中的监听器模式与观察者模式
- Android 中的监听器模式与观察者模式
- Android 中的监听器模式与观察者模式
- 观察者模式(监听器模式
- 观察者模式与事件监听器模式--java设计模式扫盲
- 观察者模式和监听器
- 监听器简介+观察者模式
- 观察者和监听器模式
- 《JAVA与模式》之观察者设计模式及自定义监听器
- 监听器模式(观察者模式)
- 观察者模式(监听器模式)
- 观察者模式(监听器模式)
- 观察者模式(监听器模式)
- 观察者模式(监听器模式)
- 观察者模式和监听器原理
- 观察者模式(自定义监听器)
- 如何脱颖而出?
- Spring框架使用内幕之AOP&AspectJ&Spring JdbcTemplate
- 数据库索引小结
- oracle服务器重启后监听启动
- play framework框架下,连接到MongoDB时的特殊操作(与或查询,模糊查询,范围查询,数据排序等)
- bindservice与使用监听器更新进度+观察者模式
- 【JZOJ4155】传送 题解
- 洛谷 P1346 电车
- 润乾报表动态显示或者增加列
- 环信SDK3.2.3和EaseUI消息列表和聊天的简单实现
- CSS实现3D轮播效果
- SQL和mySQL
- 使用FindBugs-IDEA插件找到代码中潜在的问题
- Spring中Bean及@Bean的理解