Android跨進程通信之AIDL

需求描述

進程A調(diào)起第三方進程B進行第三方登錄 – 實現(xiàn)雙向通信

代碼(進程A)

1.目錄結(jié)構(gòu)

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中的服務(wù)
        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, "未安裝第三方應(yīng)用啊~", Toast.LENGTH_SHORT).show();
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (iLogin != null) {
            unbindService(conn);
        }
    }
}

對應(yīng)界面

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登錄回調(diào)的Service

public class LoginService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        // 該Binder對象返回給進程B來回調(diào)
        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" // 是否可以被系統(tǒng)實例化
            android:exported="true" // 是否可以被其他進程隱式調(diào)用
            android:process=":remote_a">
            <intent-filter>
                <action android:name="ACTION_A"/>
            </intent-filter>
        </service>

    </application>

</manifest>



代碼(進程B)

1.目錄結(jié)構(gòu)

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中的服務(wù)
        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);
        }
    }
}

對應(yīng)界面

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調(diào)用的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() {
        // 調(diào)起登錄頁面
        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的詳細(xì)內(nèi)容,更多關(guān)于Android跨進程通信AIDL的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容