【Binder 机制】AIDL 分析 ( 创建 Service 服务 | 绑定 Service 远程服务 )

简介: 【Binder 机制】AIDL 分析 ( 创建 Service 服务 | 绑定 Service 远程服务 )

文章目录

一、创建 Service 远程服务

1、创建 Service

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

二、绑定 Service 远程服务

1、核心代码

2、完整代码

3、运行结果





一、创建 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,
目录
相关文章
|
6月前
|
Android开发 移动开发 小程序
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
|
6月前
|
数据采集 Python SQL
2024年校花转学到我们班,于是我用Python把她空间给爬了个遍!(1),binder机制面试题
2024年校花转学到我们班,于是我用Python把她空间给爬了个遍!(1),binder机制面试题
2024年校花转学到我们班,于是我用Python把她空间给爬了个遍!(1),binder机制面试题
|
存储 Java Android开发
听说你Binder机制学的不错,来面试下这几个问题(二)
听说你Binder机制学的不错,来面试下这几个问题(二)
297 0
听说你Binder机制学的不错,来面试下这几个问题(二)
|
存储 缓存 Java
听说你Binder机制学的不错,来面试下这几个问题(三)
听说你Binder机制学的不错,来面试下这几个问题(三)
282 0
听说你Binder机制学的不错,来面试下这几个问题(三)
|
存储 Java 大数据
听说你Binder机制学的不错,来面试下这几个问题(一)
听说你Binder机制学的不错,来面试下这几个问题(一)
725 0
听说你Binder机制学的不错,来面试下这几个问题(一)
|
消息中间件 存储 缓存
Android进程间通信之一:Binder机制学习
Android进程间通信之一:Binder机制学习
224 0
Android进程间通信之一:Binder机制学习
|
Java Android开发 C++
|
Java Android开发
Binder机制中的收发消息及线程池
在阅读《深入理解android内核设计思想》的有关Binder章节的时候,发现书中有部分问题没有很清晰的描述清楚,所以这篇文章主要是针对收发消息的过程和线程池这两个知识点详细展开一下。注意本篇文章并不是介绍Binder机制,而是针对它的两个小细节深入探讨一下,所以建议大家先详细的阅读《深入理解android内核设计思想》中有关Binder章节后对照阅读本篇文章。
363 0
【Binder 机制】Native 层 Binder 机制分析 ( 查找 Binder 服务 | svcmgr_handler | do_find_service )
【Binder 机制】Native 层 Binder 机制分析 ( 查找 Binder 服务 | svcmgr_handler | do_find_service )
137 0
【Binder 机制】Native 层 Binder 机制分析 ( 注册 Binder 服务 | svcmgr_handler | do_add_service | find_svc )
【Binder 机制】Native 层 Binder 机制分析 ( 注册 Binder 服务 | svcmgr_handler | do_add_service | find_svc )
129 0