详解Android跨进程通信之AIDL

时间:2021-05-19

需求描述

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

代码(进程A)

1.目录结构

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); } }}

对应界面

3. ILoginInterface.aidl

// ILoginInterface.aidlpackage com.example.process;// Declare any non-default types here with import statementsinterface 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.目录结构

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); } }}

对应界面

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

<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的资料请关注其它相关文章!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章