詳解Android跨進(jìn)程通信之AIDL
需求描述
進(jìn)程A調(diào)起第三方進(jìn)程B進(jìn)行第三方登錄 – 實(shí)現(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對(duì)象
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);
}
}
}
對(duì)應(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對(duì)象返回給進(jìn)程B來(lái)回調(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)實(shí)例化
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);
}
}
}
對(duì)應(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)起登錄頁(yè)面
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的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android開(kāi)發(fā)之a(chǎn)ndroid_gps定位服務(wù)簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Android開(kāi)發(fā)之a(chǎn)ndroid_gps定位服務(wù)簡(jiǎn)單實(shí)現(xiàn) ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Android自定義實(shí)現(xiàn)循環(huán)滾輪控件WheelView
滾輪布局WheelView大家經(jīng)常使用,比如在選擇生日的時(shí)候,風(fēng)格類似系統(tǒng)提供的DatePickerDialog,這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)循環(huán)滾輪控件WheelView,感興趣的小伙伴們可以參考一下2016-07-07
Android學(xué)習(xí)筆記之ActionBar Item用法分析
這篇文章主要介紹了Android學(xué)習(xí)筆記之ActionBar Item用法,結(jié)合實(shí)例形式分析了ActionBar Item的具體功能與相關(guān)使用技巧,需要的朋友可以參考下2017-05-05
Android自定義帶動(dòng)畫(huà)效果的圓形ProgressBar
這篇文章主要為大家詳細(xì)介紹了Android自定義帶動(dòng)畫(huà)效果的圓形ProgressBar,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Android?線程死鎖場(chǎng)景與優(yōu)化解決
線程死鎖是老生常談的問(wèn)題,線程池死鎖本質(zhì)上屬于線程死鎖的一部分,線程池造成的死鎖問(wèn)題往往和業(yè)務(wù)場(chǎng)景相關(guān),本文主要介紹了Android?線程死鎖場(chǎng)景與優(yōu)化,感興趣的可以了解一下2023-12-12
Android小程序?qū)崿F(xiàn)訪問(wèn)聯(lián)系人
這篇文章主要為大家詳細(xì)介紹了Android小程序?qū)崿F(xiàn)訪問(wèn)聯(lián)系人,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一2020-05-05
Android 列表倒計(jì)時(shí)的實(shí)現(xiàn)的示例代碼(CountDownTimer)
本篇文章主要介紹了Android 列表倒計(jì)時(shí)的實(shí)現(xiàn)的示例代碼(CountDownTimer),具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
Android getReadableDatabase() 和 getWritableDatabase()分析對(duì)比
這篇文章主要介紹了Android getReadableDatabase() 和 getWritableDatabase()分析對(duì)比的相關(guān)資料,需要的朋友可以參考下2017-06-06
RecyclerView實(shí)現(xiàn)拖拽排序效果
這篇文章主要為大家詳細(xì)介紹了RecyclerView實(shí)現(xiàn)拖拽排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

