启动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之间的通信的更多相关文章

  1. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

  2. Android中两个Activity之间简单通信

    在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...

  3. android中fragment与activity之间通信原理以及例子

    参考文章 http://blog.csdn.net/guozh/article/details/25327685#comments Activity和fragment通信方式一般有3种方法 1.在fr ...

  4. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  5. Service Receiver Activity 之间的通信

    一.Activity与Service 1. 通过Intent,例子如下: Intent intent = new Intent(this, Myservice.class); // intent .p ...

  6. Android Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...

  7. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  8. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. Android(Fragment和Activity之间通信)

    Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...

随机推荐

  1. UVALive 3177 长城守卫

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  2. Using Call_Form in Oracle D2k

    Using Call_Form in Oracle D2k CALL_FORM examples/* Example 1:** Call a form in query-only mode.*/BEG ...

  3. SLAM初探-SLAM for Dummies

    SLAM综述性特别是原理讲述比较浅显易懂的的资料比较少,相对比较知名的是<SLAM for Dummies>,但中文资料相对较少,这里就简单概述一下<SLAM for Dummies ...

  4. Jquery实现图片轮换效果

    最近在看jquery书时,看到一个比较有趣的东西:图片轮换.这里和大家分享下我看完后写的一个demo.实现图片轮换要完成三部分模块:html部分.css部分.jqury部分.下面分步详细说明.1.ht ...

  5. 移动端页面 弹出框滚动,底部body锁定,不滚动 / 微信网页禁止回弹效果

    需求:页面有弹出层菜单,当弹出层菜单超出屏幕可视区域时,不能滚动.加上滚动后,底部body的滚动事件如何禁止,加上了overflow:hidden;还是不可用. 如下图:地区弹出框可以滚动,而底部的b ...

  6. iOS 分享至友盟分享

    iOS 友盟分享 这个主要是提到如何通过友盟去自定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的工程文件夹里面去: 二.注册友盟账号,将你的APP添加到你的账号里面然后 ...

  7. jsp发布:Could not publish server configuration: null. java.lang.NullPointerException

    1.jsp发布: Could not publish server configuration: null. java.lang.NullPointerException

  8. 安卓跳转到GPS设置界面

      /** * 监听GPS */ private void initGPS() { LocationManager locationManager = (LocationManager) this . ...

  9. Js Map 实现

    /* * MAP对象,实现MAP功能 * * 接口: * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, v ...

  10. RANSAC 剔除错误匹配 估计模型

    随机抽样一致,这个算法,我以前一直都没有理解透彻.只知道可以用来直线拟合,网上大多数中文博客也都是写直线拟合的,但是用来匹配二维特征的时候,总还是没弄明白. 基本概念参考 http://www.cnb ...