binder机制aidl分析(创建service服务|绑定service远程服务)(代码片段)

韩曙亮 韩曙亮     2023-01-04     728

关键词:





一、创建 Service 远程服务




1、创建 Service


package kim.hsl.aidl_demo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.util.List;

public class MainActivity extends AppCompatActivity 
    public static final String TAG = "MainActivity";

    private IMyAidlInterface aidl;

    private ServiceConnection serviceConnection = new ServiceConnection() 
        /**
         * 传入需要的 Service , 让系统寻找指定的远程服务
         * @param name
         * @param service
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            // 通过 IBinder 对象 , 从系统中获取对应的远程服务或代理对象
            aidl = IMyAidlInterface.Stub.asInterface(service);
            Log.i(TAG, "AIDL 获取成功");
        

        @Override
        public void onServiceDisconnected(ComponentName name) 
            aidl = null;
        
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 通过 Action 和 包名 , 绑定远程服务
        Intent intent = new Intent("android.intent.action.MyService");
        intent.setPackage("kim.hsl.aidl_demo");
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

        findViewById(R.id.add).setOnClickListener((View view)->
            try 
                aidl.addStudent(new Student("Tom"));
             catch (RemoteException e) 
                e.printStackTrace();
            
        );

        findViewById(R.id.get).setOnClickListener((View view)->
            try 
                List<Student> students = aidl.getStudents();
                Log.i(TAG, "students = " + students);
             catch (RemoteException e) 
                e.printStackTrace();
            
        );
    


2、AndroidManifest.xml 清单文件中配置 Service


        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MyService" />
            </intent-filter>
        </service>




二、绑定 Service 远程服务




1、核心代码


通过 Action 和 包名 , 绑定远程服务 , 其中 Action 是在 AndroidManifest.xml 清单文件中配置的 ;

        // 通过 Action 和 包名 , 绑定远程服务
        Intent intent = new Intent("android.intent.action.MyService");
        intent.setPackage("kim.hsl.aidl_demo");
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

2、完整代码


完整代码如下 :

package kim.hsl.aidl_demo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.util.List;

public class MainActivity extends AppCompatActivity 
    public static final String TAG = "MainActivity";

    private IMyAidlInterface aidl;

    private ServiceConnection serviceConnection = new ServiceConnection() 
        /**
         * 传入需要的 Service , 让系统寻找指定的远程服务
         * @param name
         * @param service
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) 
            // 通过 IBinder 对象 , 从系统中获取对应的远程服务或代理对象
            aidl = IMyAidlInterface.Stub.asInterface(service);
            Log.i(TAG, "AIDL 获取成功");
        

        @Override
        public void onServiceDisconnected(ComponentName name) 
            aidl = null;
        
    ;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 通过 Action 和 包名 , 绑定远程服务
        Intent intent = new Intent("android.intent.action.MyService");
        intent.setPackage("kim.hsl.aidl_demo");
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

        findViewById(R.id.add).setOnClickListener((View view)->
            try 
                aidl.addStudent(new Student("Tom"));
             catch (RemoteException e) 
                e.printStackTrace();
            
        );

        findViewById(R.id.get).setOnClickListener((View view)->
            try 
                List<Student> students = aidl.getStudents();
                Log.i(TAG, "students = " + students);
             catch (RemoteException e) 
                e.printStackTrace();
            
        );
    


3、运行结果


点击添加按钮 , 即可向远程服务中添加 Student 对象 , 点击获取按钮 , 即可在日志中打印之前添加的所有 Student 对象 ;

2021-09-16 15:11:14.492 27781-27781/kim.hsl.aidl_demo I/MainActivity: AIDL 获取成功
2021-09-16 15:11:14.499 27781-27866/kim.hsl.aidl_demo I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 1
2021-09-16 15:11:14.499 27781-27866/kim.hsl.aidl_demo I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
2021-09-16 15:11:14.499 27781-27866/kim.hsl.aidl_demo I/OpenGLRenderer: Initialized EGL, version 1.4
2021-09-16 15:11:27.704 27781-27781/kim.hsl.aidl_demo I/MainActivity: students = [name=Tom, name=Tom]


2021-09-16 15:11:40.729 27781-27781/kim.hsl.aidl_demo I/MainActivity: students = [name=Tom, name=Tom, name=Tom, name=Tom, name=Tom, name=Tom, name=Tom, name=Tom]

binder的工作机制浅析

在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制。一、在AndroidStudio中建立AIDL首先,我们需要建立一个AIDL1.在建立了对应的实现Parcelable... 查看详情

binder机制aidl分析(创建aidl文件|创建parcelable类|aidl中使用parcelable类|编译工程生成aidl对应的java源文件)(代(代码片段)

文章目录一、创建AIDL文件1、创建AIDL目录2、创建AIDL文件3、创建Parcelable类4、AIDL目录下声明Parcelable类5、AIDL中使用Parcelable类二、编译工程生成AIDL文件对应的Java源文件1、编译工程2、生成的AIDL对应Java源文件一、创建AIDL文件1、创... 查看详情

binder机制在aidl中的实现分析

本篇主要通过结合已经阅读的Binder机制相关资料(《Android开发艺术探索》和http://weishu.me/2016/01/12/binder-index-for-newer/),通过AIDL来进行Binder机制的初步理解感谢两位作者:任玉刚和WeiShu一一个AIDLDemo的组成部分二通信机制的分析1bindS... 查看详情

binder机制aidl分析(aidl通信完整流程梳理)(代码片段)

...Stub.Proxy代理类5、IMyAidlInterface.Stub.Proxy代理类方法执行6、Binder.transact方法执行7、IMyAidlInterface.Stub.onTransac 查看详情

binder机制在aidl中的实现分析(代码片段)

本篇主要通过结合已经阅读的Binder机制相关资料(《Android开发艺术探索》和http://weishu.me/2016/01/12/binder-index-for-newer/),通过AIDL来进行Binder机制的初步理解感谢两位作者:任玉刚和WeiShu一一个AIDLDemo的组成部分二通信机制的... 查看详情

binder连接池

Binder连接池首先回顾一下AIDL的大致流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定Service࿰... 查看详情

binder机制在aidl中的实现分析(代码片段)

本篇主要通过结合已经阅读的Binder机制相关资料(《Android开发艺术探索》和http://weishu.me/2016/01/12/binder-index-for-newer/),通过AIDL来进行Binder机制的初步理解感谢两位作者:任玉刚和WeiShu一一个AIDLDemo的组成部分二通信机制的... 查看详情

binder连接池

Binder连接池首先回顾一下AIDL的大致流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定Service࿰... 查看详情

binder机制native层binder机制分析(查找binder服务|svcmgr_handler|do_find_service)(代码片段)

文章目录前言一、查找Binder服务二、service_manager.c|do_find_service前言在上一篇博客【Binder机制】Native层Binder机制分析(binder_loop|svcmgr_handler|binder.c|binder_parse)中,简单介绍了在service_manager.c中的main函数中调用了binder_loop方法,在binder_loo 查看详情

androidframework实战开发-binder专题讲解之aidl文件的详细分析(代码片段)

...l,service。确实这个aidl和service的方式是应用开发中对binder接触层面应该属于最为接近的一层。因为其他的接口方式跨进程通信,比如startActivtiy,ContentProvider,broadc 查看详情

binder机制native层binder机制分析(注册binder服务|svcmgr_handler|do_add_service|find_svc)(代码片段)

文章目录前言一、注册Binder服务二、service_manager.c|do_add_service三、service_manager.c|svc_can_register四、service_manager.c|find_svc五、service_manager.c|svcinfo_death前言在上一篇博客【Binder机制】Native层Binder机制分析(binder_loop|svc 查看详情

源码分析——从aidl的使用开始理解binder进程间通信的流程

 源码分析——从AIDL的使用开始理解Binder进程间通信的流程Binder通信是Android系统架构的基础。本文尝试从AIDL的使用开始理解系统的Binder通信。0x00一个AIDL的例子首先我们创建一个项目,写一个RemoteService.java,并定义个AI... 查看详情

androidbinder原理

参考技术A以前看源码经常会看到Binder的东西,比如AMS,ActivityThread等,之前虽然对Binder有所了解,但也是模模糊糊的,这次终于下定决心好好的弄一弄它的原理,揭开它头上的那块面纱。首先,Binder主要是Android跨进程通信的一种... 查看详情

androidframework实战开发-binder专题讲解之aidl文件的详细分析(代码片段)

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论android跨进程通信实战视频课程(加群获取优惠)大家平时做应用开发时候也经常会遇到有跨进程通信的需求,这里大部分通信... 查看详情

binder机制native层binder机制分析(service_manager.c|开启binder|注册binder进程上下文|开启binder循环)(代码片(代码片段)

文章目录一、系统服务二、系统服务主函数三、开启Binder四、注册上下文五、开启Binder循环六、binder_write方法七、binder_ioctl内核方法八、binder_ioctl_write_read内核方法一、系统服务SystemServer是由Zygote进程fork()出来的;Init进程启动Zygot... 查看详情

使用aidl

...p;首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。需要注意的是,AIDL的包结构在服务端和客户端要保持一致,否则运行会出错,这是因为客户端需要反序... 查看详情

service精通

...是什么,会用即可!开始本节内容~本节对应官方文档:Binder1.Binder机制初涉1)IBinder和Binder是什么鬼?我们来看看官方文档怎么说:中文翻译:IBinder是远程对象的基本接口,是饿了高性能而设计的轻量级远程调用机制的核心部分... 查看详情

bindservice之aidl使用和调用流程分析

...tub类,以及私有Proxy,这是客户端client和服务端Service通过binder驱动通讯用。2、提供外部绑定的service以及在XML上声明权限:ServerService.java:其中onBind返回的对象IBinder给客户端client绑定服务成功回调函数onServiceConnected。XML声明permissi... 查看详情