您当前的位置: 首页 >  android

梁同学与Android

暂无认证

  • 4浏览

    0关注

    618博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android --- AIDL 的理解

梁同学与Android 发布时间:2022-06-18 16:26:41 ,浏览量:4

文章目录
  • 一、同应用启动 Service
  • 二、跨应用启动 Service
  • 三、跨应用绑定 Service
  • 四、AIDL 的通信流程
  • 五、startService()和bindService()区别
AIDL 的全称是 Android Interface Definition Language(安卓接口定义语言) 下面三四是重点,一二五给大家作为补充

一、同应用启动 Service
 startService(new Intent(this,AppService.class));
二、跨应用启动 Service
Intent serviceIntent = new Intent();
serviceIntent.setComponent(new omponentName("com.example.test", "com.example.test.BookManagerService"));
startService(serviceIntent);

ComponentName 的两个参数:第一个参数是另外一个应用的包名,第二个参数是另外一个应用的Service 所在的位置

还有,被启动的Service需要在所在的项目的AndroidManifest.xml中声明Service权限,exporter的属性为true,否则不能跨应用启动

三、跨应用绑定 Service
private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            System.out.println("----服务已绑定");
            IBookManager iBookManager = IBookManager.Stub.asInterface(iBinder);
            try {
                List list = iBookManager.getBookList();
                Log.i("书的信息:", list.toString());
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            System.out.println("service disconnected");
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_01 = findViewById(R.id.btn_01);
        System.out.println("__________________client-------------------------");
        btn_01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName("com.example.test", "com.example.test.BookManagerService"));
                bindService(intent, connection, Context.BIND_AUTO_CREATE);
            }
        });
    }
四、AIDL 的通信流程

一、服务端 1.服务端首先要创建一个 Service 用来监听客户端的连接请求 2.然后创建一个 AIDL 文件,将暴露给客户端的接口在这个 AIDL 文件中声明 3.最后在 Service 中实现这个 AIDL 接口即可。

二、客户端 首先需要绑定服务端 Service(建立连接 ServiceConnection),绑定成功后,将服务端返回的 Binder 对象转成所属的类型,接着就可以调用 AIDL 中的方法了。

五、startService()和bindService()区别

1.执行startService时,Service会经历onCreate->onStartCommand。 当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。

2.执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。这里所谓的绑定在一起就是说两者共存亡了。

3.多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。Service的onStart方法在API 5时被废弃,替代它的是onStartCommand方法。

4.第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。

关注
打赏
1660730345
查看更多评论
立即登录/注册

微信扫码登录

0.1004s