美文网首页
android AIDL进程间通信(只介绍了简单数据类型)

android AIDL进程间通信(只介绍了简单数据类型)

作者: 空老表 | 来源:发表于2018-10-31 15:18 被阅读0次

    先上git的地址

    https://gitee.com/wanghong_wahaha/AidlDemo.git

    前言:之前在网上找过一些博客学习AIDL,但是很多只有介绍,但是没有demo可供参考,或者干脆就做在了一个APP里面,达不到两个APP间通信的要求,所以就自己整理一下。

    1.创建服务端的app,新建aidl文件,点击编译按钮(如果不编译会找不到定义接口生成的Stub抽象类)

    1540967210(1).jpg
    TIM截图20181031143248.png `~ZCISN9ZZO(YIJ]`V}FSNU.png
    2.创建一个server供客户端调用,onBind(Intent intent)方法需要返回自定义的AIDL接口
        public class MyService extends Service {
        
            @Nullable
            @Override
            public IBinder onBind(Intent intent) {
                return new IBinderImp(){
                    @Override
                    public String str(String str) throws RemoteException {
                        Log.d("MyService",str);
        
                        return super.str(str);
                    }
                };
            }      
        }
    
        public class IBinderImp extends My_Service_Int.Stub {
        
            @Override
            public String str(String str) throws RemoteException {
                return str;
            }
        }
    
        //注意 android:exported="true" ,不然外部无法访问到
        <service
            android:name=".MyService"
            android:enabled="true"
            android:process=":AidlService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.kong.myapplication.MyServer" />
            </intent-filter>
    
        </service>
    

    3.新建另一个module(客户端),拷贝main目录下的整个AIDL文件夹到此module下,老规矩,编译,然后编写代码绑定服务端的Service,需要设定其action和application的包名

        class MainActivity : AppCompatActivity() {
        
            lateinit var my_service_int: My_Service_Int
            lateinit var connection: ServiceConnection
        
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
        
        
                val intents = Intent("com.example.kong.myapplication.MyServer")
                intents.setPackage("com.example.kong.myapplication")
        //        intents.component = ComponentName("com.example.kong.myapplication", "com.example.kong.myapplication.MyServer")
                connection = object : ServiceConnection {
                    override fun onServiceConnected(name: ComponentName, service: IBinder) {
        
                        Log.d("MainActivity", "链接上了")
                        //AIDL接口调用asInterface(Binder) 获取到接口对象
        
                        my_service_int = My_Service_Int.Stub.asInterface(service)
        
                    }
        
                    override fun onServiceDisconnected(name: ComponentName) {
        
                    }
                }
        
                bindService(intents, connection, BIND_AUTO_CREATE)
        
        
            }
        
            override fun onDestroy() {
                super.onDestroy()
                unbindService(connection)
            }
        
            fun sendMessage(v: View) {
                try { //调用接口中的方法,为其赋值
                    my_service_int.str("新闻联播")
                } catch (e: RemoteException) {
                    e.printStackTrace()
                }
        
            }
        }
    
    TIM截图20181031151524.png

    接下来就测试服务有没有收到消息,我点点点点点点点点点点点点点点点....

    TIM截图20181031151558.png

    好的,测试通过,over

    本文参考 https://blog.csdn.net/weixin_41317842/article/details/79138291

    相关文章

      网友评论

          本文标题:android AIDL进程间通信(只介绍了简单数据类型)

          本文链接:https://www.haomeiwen.com/subject/kqratqtx.html