课程:http://www.jikexueyuan.com/course/715_3.html?ss=1
在activity和service之间通信。
首先使用的是启动服务来通信。注意是如何使用Intent取得EditText的数据并传递给service的,在service是又是如何取出数据的。
在MainActivity中
private EditText etData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); etData = (EditText)findViewById(R.id.etData); findViewById(R.id.btnStartService).setOnClickListener(this);
findViewById(R.id.btnStopService).setOnClickListener(this);
} public void onClick(View v) {
switch (v.getId()){
case R.id.btnStartService:
Intent i = new Intent(this,MyService.class);
i.putExtra("data",etData.getText().toString());
startService(i);
break;
case R.id.btnStopService:
stopService(new Intent(this,MyService.class));
break;
}
}
在MyService中,通过启动服务的onCommand来取得数据
public int onStartCommand(Intent intent, int flags, int startId) { data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId);
}
接下来用绑定服务来完成通信。
增加两个绑定按钮和一个数据同步按钮
case R.id.btnBindService:
bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
break;
case R.id.btnSyncData:
if(binder!=null){
binder.setData(etData.getText().toString());
在绑定服务中需完成两个函数
@Override
public void onServiceConnected(ComponentName name, IBinder service) { binder = (MyService.Binder)service;
} @Override
public void onServiceDisconnected(ComponentName name) { }
其中的binder悄悄完成了activiy和service之间的通信(这里面的过程很微妙,好好体会)
public IBinder onBind(Intent intent) { return new Binder();
} public class Binder extends android.os.Binder{ public void setData(String data){ MyService.this.data = data;
}
}
总结下启动服务和绑定服务与活动通信的不同:
启动服务是通过Intent对象来取得数据,通过startService启动onStartCommand来过多成Intent对象的传递。
绑定服务是通过binder对象中的函数来完成通信。
前面讲的是从activity中获取数据到MyService,即从UI线程(主线程)从获取数据到子线程中,那么如何总子线程中获取数据到主线程中呢?
示例中在子线程中完成数据的变化,要求将其显示在UI的TextView上。
这里用到了回调的方式。首先定交一个接口CallBack用于向UI中传递变化的数据,在activity中实现接口中的函数,取得数据,并以message的方式传递给Handler,再将其传递给TextView进行显示。
这个过程还是挺复杂的,需要细心体会。
Service(二):通信的更多相关文章
-
Android中AIDL的理解与使用(二)——跨应用绑定Service并通信
跨应用绑定Service并通信: 1.(StartServiceFromAnotherApp)AIDL文件中新增接口: void setData(String data); AppService文件中 ...
-
Android学习总结(四)—— Activity和 Service进行通信
一.Activity 和 Service进行通信的基本概念 前面我们学习我生命周期里面包含了启动和停止服务的方法,虽然服务器在活动里启动,但在启动了服务之后,活动与服务基本就没有什么关系了.我们在活动 ...
-
Android中Service通信(二)——绑定Service进行通信
一.把输入文本的数据同步到服务的实例(如何执行服务的内部代码) 绑定服务比启动服务更加方便高效,绑定服务中的直接方法调用比Intent作为载体传输更为快捷得多. 1.activity_main.xml ...
-
service worker(二)之主页面与service worker通信
实现一个主页面发送消息,worker搜到信息向所有的页面派发消息(当前页面除外) msg.html <!DOCTYPE html> <html lang="en" ...
-
Android Activity与远程Service的通信学习总结
当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意 ...
-
201709012工作日记--activity与service的通信机制
service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...
-
Android service ( 二) 远程服务
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android平台中,一个进程通常不能访问其他进程中的内存 ...
-
社会地位即服务, Status as a Service (二): 社交网络的投资回报率 (ROI)
本文作者 Eugene Wei 是 Amazon 战略部门的第一位分析师,后来还担任过 Flipboard, Hulu, Oculus 的产品负责人. 原文标题是 Status as a Servic ...
-
CXF实战之在Tomcat中公布Web Service(二)
服务接口及实现类请參考WebService框架CXF实战(一) 创建Maven Web项目,在pom.xml中加入CXF和Spring Web的引用,因为CXFServlet须要Spring Web的 ...
随机推荐
-
Session的使用过程中应注意的一个小问题
在学习AllEmpty大神的从零开始编写自己的C#框架系列文章中,发现的问题:在验证码的缓存Session["vcode"]的赋值时,发现Session["vcode&q ...
-
CBitmap、HBITMAP、BITMAP相互转换
一:理解 BITMAP是C++中定义的位图结构体 HBITMAP是Windows中使用的位图句柄 CBitmap是MFC封装的位图类 二:相互转换 1.HBITMAP->CBitmap 方法一: ...
-
iOS 音乐
iOS 音乐 这篇博客介绍的是较长的音频播放-音乐... 有关音效的介绍可以点击下面的连接进入... iOS 音效 首先导入框架:AVFoundation.framework 导入框架后我们在需要使用 ...
-
GPS坐标转百度地图并且加载地图示例.支持微信端访问
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Wx_VehicleLoca ...
-
SQL AlawaysOn 之二:添加组织和域用户
1.在管理工具打开Active Directory 用户和计算机 2.在域控制器名称下面右键 选择 新建--组织单位, 3.输入组织名定,点确定 4.在组织右键--新建--用户 5.输入用户信息,点 ...
-
setTimeout 倒计时
<script type="text/javascript"> //设定倒数秒数 var t = 10; //显示倒数秒数 function showTime(){ t ...
-
VM VirtrualBox 安装centos6.5后的网络设置
小白学习linux(一) 本文只是介绍VirtrualBox安装centos完成后的网络设置: 每次用虚拟机装完centos后,捣鼓半天才能上网.熟话说的好,好记性不如烂笔头,写个随笔记录下设置过程, ...
-
Filter、Listener 学习总结
今天我们来介绍 Filter.Listener 这两个模块一些简单的知识和应用,接下来我们开始我们的正题 ! 1. Filter(过滤器) 1.1 对 Servlet 容器调用 Servlet 的过程 ...
-
MyBatis的接口式编程Demo
很久没细看过MyBatis了,时间一长就容易忘记. 下面是一个接口式编程的例子. 这里的例子一共分为4步: 1 首先要有一个namespace为接口的全类名的映射文件,该例中是 IMyUser.xml ...
-
flask异常处理
对于异常,通常可以分为两类:一类是可以预知的异常,我们通常会用try...except....捕捉,第二类是未知的error,我们是无法预知的. try: code block except A: e ...