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


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

  • 相关阅读:
    VSCode前端 插件
    restframework 分页组件、响应器
    restframework 解析器、渲染器、url控制组件
    __getattr__
    apply和call的用法
    继承
    原型的指向改变
    局部变量变全局变量
    构造函数和实例对象和原型对象之间的关系
    _proto_和prototype
  • 原文地址:https://www.cnblogs.com/wanghaoyuhappy/p/5293696.html
Copyright © 2020-2023  润新知