绑定服务调用本地服务中的方法

Posted 王浩宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绑定服务调用本地服务中的方法相关的知识,希望对你有一定的参考价值。

如果想调用服务中的方法, 通过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中调用了.

 

以上是关于绑定服务调用本地服务中的方法的主要内容,如果未能解决你的问题,请参考以下文章

本机代码绑定到 java 中的服务

绑定服务抽取接口

树莓派 python 如何将本地文件上传到指定的服务器页面上

如何从android中的非Activity类调用服务方法

本地应用调用远程服务中的方法

从片段调用 Google Play 游戏服务