如果想调用服务中的方法, 通过startService()是做不到的, 这时需要用bindService来解决.

下面的demo是在Activity中调用Service中的自定义方法---methodInService

这个demo可以解决在项目开发中调用service里的数据。

这里在service中使用到了代理模式。这是为了,给service组件和activity组件中间添加一个中间人。

通过代理来传递数据。也就是binder对象。这个代理就是接口IService

Service中的代码如下:

 1 public class DemoService extends Service {
 2
 3     /**
 4      * 内部的小蜜,可以调用服务内部的方法
 5      * 将小蜜私有了,建一个接口,提供对外访问的方法
 6      */
 7     private class Xiaomi extends Binder implements IService{
 8         //通过这个方法调用服务中的方法
 9         //重写接口中的抽象方法
10         public void callMethodInService(int money){
11             if(money > 100){
12                 //这里调用了服务里的方法
13                 methodInService();
14             }else{
15                 System.out.println("这点钱还想办事啊?");
16             }
17         }
18
19         public void 洗桑拿(){
20             System.out.println("一起洗桑拿");
21         }
22     }
23
24     /**
25      * 在执行bindService时调用该方法
26      * IBinder相当于内部的小蜜
27      */
28     @Override
29     public IBinder onBind(Intent intent) {
30         System.out.println("2,服务如果成功绑定,会执行onBind方法,返回IBinder小蜜");
31         return new Xiaomi();
32     }
33
34     @Override
35     public void onCreate() {
36         System.out.println("服务已经开启了");
37
38     }
39
40     @Override
41     public void onDestroy() {
42         System.out.println("服务已经关闭了");
43         super.onDestroy();
44     }
45
46     /**
47      * 服务中的方法
48      */
49     public void methodInService(){
50         System.out.println("6,你成功调用了服务中的方法");
51     }
52
53 }

IService接口代码如下:

1 public interface IService {
2
3     public void callMethodInService(int money);
4
5 }

Activity中的代码如下:

 1 public class MainActivity extends Activity {
 2
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7     }
 8
 9     MyConn conn;
10     //创建接口的对象
11     IService myBinder;
12
13     //绑定服务
14     public void bindService(View view) {
15         System.out.println("1,绑定服务");
16         Intent intent = new Intent(this, DemoService.class);
17         conn = new MyConn();
18         bindService(intent, conn, BIND_AUTO_CREATE);
19     }
20
21     //解绑服务
22     public void unbindService(View view) {
23
24         unbindService(conn);
25     }
26
27     /**
28      * 调用服务里的方法
29      */
30     public void callService(View view) {
31         //通过内部的小蜜可以间接调用服务里的方法
32         System.out.println("5,利用myBinder间接调用服务里的方法");
33         myBinder.callMethodInService(500);
34     }
35
36
37     /**
38      * 服务成功连接的通讯频道
39      */
40     private class MyConn implements ServiceConnection{
41
42         //服务成功连接时
43         @Override
44         public void onServiceConnected(ComponentName name, IBinder service) {
45             System.out.println("3,得到了服务的链接,获取到了小蜜");
46             myBinder = (IService) service;
47             System.out.println("4,将IBinder强制转换为小蜜myBinder");
48         }
49
50         //服务连接不成功时
51         @Override
52         public void onServiceDisconnected(ComponentName name) {
53
54         }
55     }
56 }

关键代码已经用红色标出

在这个demo中, Activity想直接调用服务中的方法是办不到的, 于是可以定义一个代理Iservice接口,

让Service中的内部类Xiaomi来实现该接口, 并重写抽象方法, 这样就可以在Activity中调用了.

转载于:https://www.cnblogs.com/wanghaoyuhappy/p/5293696.html

绑定服务调用本地服务中的方法相关推荐

  1. centos7 搭建本地git_本地服务调用K8S环境中的SpringCloud微服务实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总及配套源码,涉及Java.Docker.K8S.Devops等 下图是典型的微 ...

  2. docker的接口 外部如何访问k8s_本地服务调用K8S环境中的SpringCloud微服务实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总及配套源码,涉及Java.Docker.K8S.Devops等 下图是典型的微 ...

  3. dubbo+zk+apollo微服务,联调调用本地服务

    今天遇到个好玩的事情,和前端联调.每次查出的结果不一样,swagger测试的结果也不一样.debug后,有好几次不进入断点 啥情况?我没改吗.可是有时候查询结果又是对的. 后来,才反应过来.部署了测试 ...

  4. SpringCoud - 基础入门(服务注册与发现、服务调用、服务降级与熔断篇)

    SpringCloud:是一系列框架的有序集合,也是一套完整的微服务解决方案.利用SpringBoot的开发便利巧妙的简化了分布式系统基础设施的开发,如发现注册.配置中心.消息总线.负载均衡.断路器. ...

  5. 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

    文章目录 一.闭包中调用 Groovy 脚本中的方法 二.owner 与 delegate 区别 三.闭包中调用 Groovy 对象中的方法 一.闭包中调用 Groovy 脚本中的方法 在 Groov ...

  6. java 调用cpp_java jni 调用cpp文件中的方法 | 学步园

    这里说下最近修改nutch的源码碰到的调用cpp文件中的方法. 刚刚开始的时候,想直接在fetch.java中直接写jni接口.后来发现这样会留下不好的编程习惯.自己动手在fetch下写一个类.Hel ...

  7. 原生微信小程序父组件调用子组件中的方法

    假设子组件中写有方法getData() // 返回数据 getData() {let flag = this.onStartValidate();if (!flag) return falselet ...

  8. JSP中调用java类中的方法

    JSP中调用java类中的方法 1.新建一个项目,在src文件夹下添加一个包:如:test 2.再在包中添加一个类:如 package test; public class conDatabase { ...

  9. 星星之火-50:无意中发现一种能够把网络视频下载到本地计算机中的方法

    目前,随着移动互联网的盛行,网络中充斥着各种大量的视频,但大多数情况下,我们智能通过客户端观看视频,无法把视频文件下载到本地,最笨的方法就是录屏. 然后,一个偶然的机会,无意中发现一种能够把网络视频下 ...

最新文章

  1. BeetleX.Http.Clients V1.5发布
  2. python 把数据写到tet_Python随身听023基础知识到底哪里用逗号?
  3. MySql数据库导出完整版(导出数据库,导出表,导出数据库结构)
  4. C++循环的内存释放问题?
  5. C#基础-Func,Action
  6. qt银行排队系统服务器代码,基于qt的银行排队系统
  7. 已知相关系数求解联合分布律
  8. as常用固定搭配_四年级英语单词详解:as的固定搭配.doc
  9. 降压恒流 LED 驱动器
  10. 解决onenote同步速度慢问题
  11. 云计算Linux运维——Linux系统——软件管理
  12. 鼓励自己最有效的10个方法
  13. 温州又一知名企业宣布倒闭破产
  14. TIOBE 11 月编程语言排行榜:Rust 在 Top 20 站住脚!
  15. 笨木头的Unity3d常用操作介绍
  16. CSAPP - LAB 1 datalab
  17. 判断两个数是否互为素数
  18. html打开d盘文件,为什么ie浏览器打不开c/d盘的html文件,直接跳出保存
  19. 商标行业有什么发展前景
  20. git提交代码被拒推送

热门文章

  1. 四种参数传递的形式——URL,超链接,js,form表单
  2. 实现对HDFS增删改查CRUD等操作
  3. JUnit基础及第一个单元测试实例
  4. UML博客建模--用例图
  5. Google C++编程风格指南
  6. Linux日志系统-04:logrotate命令格式
  7. STM32中NVIC_SystemReset()函数的作用?什么时候用?
  8. 常考数据结构与算法:实现二叉树先序,中序和后序遍历
  9. 操作系统:多处理器编程-- 蒋炎岩老师
  10. jQuery 之 [ 动画 ]