android进程通信6,详解Android跨进程通信之AIDL

需求描述

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

代码(进程A)

1.目录结构

00ab3811c111c2ce9fbcc89384dc6c24.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);

}

}

}

对应界面

b1c8b9e24c567dcc9b4a07a55a77d9d9.png

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 用于进程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

xmlns:tools="http://schemas.android.com/tools"

package="com.example.processc">

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">

android:enabled="true" // 是否可以被系统实例化

android:exported="true" // 是否可以被其他进程隐式调用

android:process=":remote_a">

代码(进程B)

1.目录结构

6a026df619fd6e2ffe8a98cedfa0244f.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);

}

}

}

对应界面

1ef1789b21106477b7c68ae944f9e132.png

3. ILoginInterface.aidl (与进程A相同)

4. 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

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">

android:enabled="true"

android:exported="true"

android:process=":remote_b">

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值