android AIDL程式間通訊(只介紹了簡單資料型別)

weixin_34185560發表於2018-10-31

先上git的地址

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

前言:之前在網上找過一些部落格學習AIDL,但是很多隻有介紹,但是沒有demo可供參考,或者乾脆就做在了一個APP裡面,達不到兩個APP間通訊的要求,所以就自己整理一下。

1.建立服務端的app,新建aidl檔案,點選編譯按鈕(如果不編譯會找不到定義介面生成的Stub抽象類)

2987511-0cab69e0df19a90c.jpg
1540967210(1).jpg

2987511-08319461208a092c.png
TIM截圖20181031143248.png

2987511-780cffdbd50118bb.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()
            }
    
        }
    }
2987511-b1df8aa868881814.png
TIM截圖20181031151524.png

接下來就測試服務有沒有收到訊息,我點點點點點點點點點點點點點點點....

2987511-b73737cf8f7356bd.png
TIM截圖20181031151558.png

好的,測試通過,over

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

相關文章