Android中Service和Activity之间的通信
启动Service并传递数据进去:
Android中通过Intent来启动服务会传递一个Intent过去。
可以在Intent中通过putExtra()携带数据
Intent startIntent = new Intent(MainActivity.this, MyService.class);
startIntent.putExtra("data", etData.getText().toString());
startService(startIntent);
在Service的onStartCommand中得到的Intent中获取这个传递过去的数据
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("Service.onStartCommand()"); data = intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
绑定Sevice并传递数据进去:
当通过绑定启动服务的时候可以用另一种方式把Activity中的数据传递到Service中。
首先在Service中定义一个Binder类,继承自系统的Binder类,然后在onBind中返回这个类的一个实例。
public class MyBinder extends android.os.Binder{
public void setData(String data){
MyService.this.data = data;
}
public MyService getService(){
return MyService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
System.out.println("Service.onBind()");
return new MyBinder();
}
这个类的实例就会在Activity中onServiceConnected中的第二个参数返回,因此也就可以在Activity中用一个实例变量保存它,并调用里面的函数。
private MyService.MyBinder myBinder;
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = (MyService.MyBinder)iBinder;
}
@Override
public void onClick(View view) {
...
case R.id.btnSyncData:
if (myBinder != null)
myBinder.setData(etData.getText().toString());
}
通过这种方式就可以把Activity中的数据传递给Service,这种方法要比直接用Intent传递要高效。
把Service中的数据传递出来:
还是利用刚刚在Sercie中创建的Binder类,用它返回一个Service的实例:
public class MyBinder extends android.os.Binder{
public void setData(String data){
MyService.this.data = data;
}
public MyService getService(){
return MyService.this;
}
}
同时在Service中定义一个钩子函数,用来给Activity取得Service的内部数据:
private CallBack callBack;
public CallBack getCallBack() {
return callBack;
}
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
public interface CallBack{
void callBackFunc(String str);
}
通过这种方法Service就可以调用这个CallBack方法:
if(callBack != null)
callBack.callBackFunc(str);
在Activity中得到了这个Service的实例以后就可以给它设置一个CallBack实例,这样每次Service调用这个函数就可以把这个数据发送出来:
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = (MyService.MyBinder)iBinder; myBinder.getService().setCallBack(new MyService.CallBack() {
@Override
public void callBackFunc(String str) {
Message message = new Message();
Bundle b = new Bundle();
b.putString("data", str);
message.setData(b);
handler.sendMessage(message);
}
}); }
可以用它来更新UI:
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
tvOut.setText(msg.getData().getString("data"));
}
};
Android中Service和Activity之间的通信的更多相关文章
- Android中BroadCast与Activity之间的通信
在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...
- Android中两个Activity之间简单通信
在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...
- android中fragment与activity之间通信原理以及例子
参考文章 http://blog.csdn.net/guozh/article/details/25327685#comments Activity和fragment通信方式一般有3种方法 1.在fr ...
- Android中Fragment与Activity之间的交互(两种实现方式)
(未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...
- Service Receiver Activity 之间的通信
一.Activity与Service 1. 通过Intent,例子如下: Intent intent = new Intent(this, Myservice.class); // intent .p ...
- Android Service与Activity之间通信的几种方式
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...
- Android中Activity、Service和线程之间的通信
Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android(Fragment和Activity之间通信)
Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...
随机推荐
- Servlet开发详解
一.Servlet简介 Servlet是sun公司提供的一门用于动态web资源的技术 sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源,需要完成两个步骤: 编写一个J ...
- python走起之第八话
1. Socket介绍 概念 A network socket is an endpoint of a connection across a computer network. Today, mos ...
- JAVA 1.2(原生数据类型 Primitive Data Type)
1. Java的数据类型分为2类 >> 原生数据类型(primitive data type) >> 引用数据类型(reference data type) 3. 常量和变量 ...
- C++编程小知识随手记
C++编程小知识点: (1)queue和vector类型: 加入元素 : queue是queue.push(),vector是vector.push_back(), 删除元素: queue是queue ...
- CentOS 程序开机自启动方法总结
1.把启动程序的命令添加到/etc/rc.d/rc.local文件中 CentOS系统下管理开机自启动的配置文件是/etc/rc.d/rc.local,所以只需编辑这个文件,在里面加入相应的启动命令即 ...
- [C语言入门笔记]变量与数据类型
变量与数据类型 什么是变量? 变量是一个变化的量 是内存中的一个空间 变量的定义方法是什么? 数据类型 变量名 = 值; 数据类型有哪些? 整型int 浮点型float double 字符型char ...
- [sqoop1.99.7] sqoop实例——数据ETL
一.创建一个mysql的link MySQL链接使用的是JDBC,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MySQL.确保mysql的jar包已经导入到${SQO ...
- Java 中的 request 和response 区别
1.response 属于重定向请求: 其地址栏的URL会改变: 会向服务器发送两次请求: 2. request 属于请求转发: 其地址栏的URL不会改变: 向服务器发送一次请求: 举一个区分它们的简 ...
- 去除 Google 重定向
1. 安装插件 redirector : https://code.google.com/p/chrome-redirector/ 2. 配置规则,如下: 匹配:https?://www\.googl ...
- 屏蔽zencart logs文件夹下不断生成的日志文件
在根目錄下的logs文件夾中,經常生成一些錯誤文件類似myDEBUGxxxxx.log這樣的錯誤文件(而且這樣的錯誤文件由來并非網站出現什麽嚴重不可挽救的錯誤,大部分是一些未定義變量這樣的不起眼的小錯 ...