Acticity与Service进行通信
如何在活动中指挥service去做事情? 这里就借助onBind()方法了
比如说,目前我们希望在MyService里提供一个下载功能,然后在活动中可以决定何时开始下载,以及随时查看下载进度。
实现这个功能的思路是创建一个专门的Binder 对象来对下载功能进行管理,修改MyService中的代码,如下所示:
public class MyService extends Service {

private DownloadBinder mBinder = new DownloadBinder();
// 在DownloadBinder类中提供开始下载以及查看下载进度的方法,这里只是模拟,没有真正实现功能。
class DownloadBinder extends Binder {

public void startDownload() {
Log.d("MyService", "startDownload executed");
}

public int getProgress() {
Log.d("MyService", "getProgress executed");
return 0;
}

}
//接着,在在MyService中创建了DownloadBinder的实例,然后在onBind() 方法里返回了这个实例,
//这样MyService中的工作就全部完成了。
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}

...

}
接下来,如何在活动中调用服务中的这些方法呢?
首先在layout文件中新增两个按钮,
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

...

<Button
android:id="@+id/bind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Bind Service" />

<Button
android:id="@+id/unbind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Unbind Service" />

</LinearLayout>

这两个按钮分别是用于绑定服务和取消绑定服务的,那到底谁需要去和服务绑定呢?当然就是活动了。
当一个活动和服务绑定了之后,就可以调用该服务里的Binder 提供的方法了。修改MainActivity中的代码,如下所示:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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();
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
Button bindService = (Button) findViewById(R.id.bind_service);
Button unbindService = (Button) findViewById(R.id.unbind_service);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
...
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务
break;
case R.id.unbind_service:
unbindService(connection); // 解绑服务
break;
default:
break;
}
}

}
bindService()接收3个参数:刚刚构建的Intent对象,ServiceConnection的实例,标志位。这里标志位传入
BIND_AUTO_CREATE表示在活动和服务进行绑定后自动创建服务,这会使得MyService中的onCreate()方法得到
执行,但onStartCommand()方法不会执行。

最新文章

  1. Hystrix框架5--请求缓存和collapser
  2. css与js后边有?v=20160101
  3. ScrollView嵌套ListView嵌套GridView的上下拉以及加载更多
  4. 用ConfigurationManager读取和修改配置文件
  5. sort()排序
  6. 透过表象看本质!?之三——Kalman滤波
  7. [转载]LVS快速搭建教程
  8. 谈谈在DevOps实践中,感觉最重要的这三个技术……
  9. KNN算法--python实现
  10. python自动化运维常用模块安装
  11. Dynamics CRM Import Solution Attribute Display Name description is null or empty
  12. 【Python3爬虫】常见反爬虫措施及解决办法(二)
  13. MyBatis基础:MyBatis关联查询(4)
  14. gpu相关
  15. 《hello--world团队》第一次作业:团队亮相
  16. 8.中断按键驱动程序之poll机制(详解)
  17. Tkinter添加图片
  18. win10下sublime text3 使用view in browser的快捷鍵添加方式
  19. 关于map和hashmap
  20. Android 之 GridView具体解释

热门文章

  1. Gradle安装和在Eclipse中的使用
  2. Linux——高效玩转命令行
  3. laravel——ajax分页&amp;删除&amp;搜索
  4. structure streaming笔记
  5. 分布式消息通信Kafka-原理分析
  6. linux命令 常用
  7. 关于被删以及限制评价后,免费更换新listing的方法
  8. mtcnn
  9. line-height:150%与line-height:1.5的区别
  10. 嵌套if-esle语句