美文网首页
Android跨进程通信之AIDL

Android跨进程通信之AIDL

作者: hao_developer | 来源:发表于2022-05-12 16:05 被阅读0次

    需求描述

    进程A调起第三方进程B进行第三方登录 – 实现双向通信

    代码(进程A)

    1.目录结构

    image.png

    2.LoginActivity.java

    public class LoginActivity extends AppCompatActivity {
    
        private ILoginInterface iLogin;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initService();
        }
    
        private void initService() {
            // 绑定进程B中的服务
            Intent intent = new Intent();
            intent.setAction("ACTION_B");
            intent.setPackage("com.example.processs");
            bindService(intent, conn, BIND_AUTO_CREATE);
        }
    
        private ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // 获取到进程B中的binder对象
                iLogin = ILoginInterface.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    
        /**
         * 去登录
         *
         * @param view
         */
        public void goLogin(View view) {
            try {
                if (iLogin != null) {
                    iLogin.login();
                } else {
                    Toast.makeText(this, "未安装第三方应用啊~", Toast.LENGTH_SHORT).show();
                }
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (iLogin != null) {
                unbindService(conn);
            }
        }
    }
    

    对应界面

    image.png
    1. ILoginInterface.aidl
    // ILoginInterface.aidl
    package com.example.process;
    
    // Declare any non-default types here with import statements
    
    interface ILoginInterface {
        void login();
        void loginCallback(int loginStatus, String loginUser);
    }
    

    4.LoginService.java 用于进程B登录回调的Service

    public class LoginService extends Service {
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            // 该Binder对象返回给进程B来回调
            return new ILoginInterface.Stub() {
                @Override
                public void login() throws RemoteException {
    
                }
    
                @Override
                public void loginCallback(int loginStatus, String loginUser) throws RemoteException {
                    Log.d("lichaojun123>>>", "loginCallback: " + loginStatus + " : " + loginUser);
                }
            };
        }
    }
    

    5.AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.processc">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name="com.example.process.LoginActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service android:name="com.example.process.LoginService"
                android:enabled="true" // 是否可以被系统实例化
                android:exported="true" // 是否可以被其他进程隐式调用
                android:process=":remote_a">
                <intent-filter>
                    <action android:name="ACTION_A"/>
                </intent-filter>
            </service>
    
        </application>
    
    </manifest>
    



    代码(进程B)

    1.目录结构

    image.png

    2.LoginActivity.java

    public class LoginActivity extends AppCompatActivity {
    
        private EditText etName;
        private EditText etPwd;
    
        private ILoginInterface iLogin;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            etName = findViewById(R.id.et_name);
            etPwd = findViewById(R.id.et_pwd);
    
            initService();
        }
    
        private void initService() {
            // 绑定进程A中的服务
            Intent intent = new Intent();
            intent.setAction("ACTION_A");
            intent.setPackage("com.example.processc");
            bindService(intent, conn, BIND_AUTO_CREATE);
        }
    
        private ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iLogin = ILoginInterface.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    
        // 去登录
        public void go_login(View view) {
            if (etName.getText().toString().trim().equals("lcj")
                    && etPwd.getText().toString().trim().equals("123")) {
    
                try {
                    if (iLogin != null) {
                        // 登录成功后,通知客户端进程
                        iLogin.loginCallback(1, "登录成功");
                        finish();
                    }
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (iLogin != null) {
                unbindService(conn);
            }
        }
    }
    

    对应界面

    image.png
    1. ILoginInterface.aidl (与进程A相同)
      包名必须要相同 切记 切记 切记
    // ILoginInterface.aidl
    package com.example.process;
    
    // Declare any non-default types here with import statements
    
    interface ILoginInterface {
        void login();
        void loginCallback(int loginStatus, String loginUser);
    }
    
    1. LoginService.java 用于进程A调用的Service
    public class LoginService extends Service {
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return new ILoginInterface.Stub() {
                @Override
                public void login() throws RemoteException {
                    execLogin();
                }
    
                @Override
                public void loginCallback(int loginStatus, String loginUser) throws RemoteException {
    
                }
            };
        }
    
        private void execLogin() {
            // 调起登录页面
            Intent intent = new Intent(this, LoginActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        }
    
    }
    

    5.AndroidManifest.xml

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".LoginActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service android:name=".LoginService"
                android:enabled="true"
                android:exported="true"
                android:process=":remote_b">
                <intent-filter>
                    <action android:name="ACTION_B"/>
                </intent-filter>
            </service>
        </application>
    

    以上就是详解Android跨进程通信之AIDL的详细内容,更多关于Android跨进程通信AIDL的资料请关注脚本之家其它相关文章!
    您可能感兴趣的文章:

    相关文章

      网友评论

          本文标题:Android跨进程通信之AIDL

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