最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android跨進(jìn)程通信之AIDL

 更新時間:2021年04月09日 14:17:21   作者:CJ_Geek  
這篇文章主要介紹了詳解Android跨進(jìn)程通信之AIDL,想了解跨進(jìn)程的同學(xué)可以參考下

需求描述

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

代碼(進(jìn)程A)

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

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() {
        // 綁定進(jìn)程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) {
            // 獲取到進(jìn)程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)界面

3. 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 用于進(jìn)程B登錄回調(diào)的Service

public class LoginService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        // 該Binder對象返回給進(jìn)程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" // 是否可以被其他進(jìn)程隱式調(diào)用
            android:process=":remote_a">
            <intent-filter>
                <action android:name="ACTION_A"/>
            </intent-filter>
        </service>

    </application>

</manifest>

代碼(進(jìn)程B)

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

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() {
        // 綁定進(jìn)程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) {
                    // 登錄成功后,通知客戶端進(jìn)程
                    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)界面

3. ILoginInterface.aidl (與進(jìn)程A相同)

4. LoginService.java 用于進(jìn)程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跨進(jìn)程通信之AIDL的詳細(xì)內(nèi)容,更多關(guān)于Android跨進(jìn)程通信AIDL的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

肥城市| 呼玛县| 扎鲁特旗| 通城县| 通辽市| 攀枝花市| 阿拉善左旗| 青海省| 广汉市| 镇安县| 呼玛县| 依兰县| 乾安县| 北宁市| 鄂伦春自治旗| 双城市| 乌拉特前旗| 张家界市| 郸城县| 浠水县| 阿拉善左旗| 鄂伦春自治旗| 桓台县| 中山市| 高青县| 交城县| 康定县| 嵊泗县| 石河子市| 防城港市| 将乐县| 合作市| 垣曲县| 宜城市| 定兴县| 新巴尔虎左旗| 门头沟区| 新邵县| 凤庆县| 江华| 武强县|