Android中行程通信方式有很多種,簡單總結了一下,如下圖所示
下面就不廢話了,直接上代碼寫一個簡單的demo
一.服務端
1.先new一個AIDL file,里面寫一個測驗的方法:
package com.example.aidlservertest;
interface IMyAidlInterface {
String getTestName(String s);
}
2. 新建一個Service,里面使用剛才創建的AIDL 介面代理物件賦值給 我們新創建的 Ibinder 物件,然后將 Ibinder 通過 service的onBind方法回傳:
public class AIDLService extends Service {
public final String TAG = this.getClass().getName();
public AIDLService() {
}
private IBinder iBinder = new IMyAidlInterface.Stub() {
@Override
public String getTestName(String s) throws RemoteException {
Log.d(TAG, "s = " + s);
return "我是" + TAG + "回傳的字串";
}
};
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public IBinder onBind(Intent intent) {
return iBinder;
}
}
3. AndroidManifest 里面注冊service
<service
android:name=".AIDLService"
android:enabled="true"
android:exported="true"/>
二.接下來客戶端
1. 如果你是在兩個不同的工程下去做的話,首先記得把在服務端創建的AIDL 檔案 copy 到客戶端,包名要一樣;如果你是在一個工程下去做的話那么只用把服務端創建的service設定 android:process="com.example.remote"屬性讓它和客戶端不在一個行程即可;
2.需要通過ServiceConnect 拿到服務端的 AIDL 代理物件,然后就可以操作里面的方法了,接著系結服務即可,注意intent跳轉里面傳的service要帶上包名路徑:
public class MainActivity extends AppCompatActivity {
public final String TAG = this.getClass().getName();
private IMyAidlInterface iMyAidlInterface;
private ServiceConnection serviceConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected");
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
try {
String testName = iMyAidlInterface.getTestName("11111");
Log.d(TAG, "testName:=" + testName);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected");
}
};
}
public void test(View view){
startAndBindService();
}
private void startAndBindService() {
Intent service = new Intent();
service.setClassName("com.example.aidlservertest", "com.example.aidlservertest.AIDLService");
bindService(service, serviceConnection, Context.BIND_AUTO_CREATE);
}
}
3.最后測驗一下;
2021-03-03 18:16:38.759 17934-17934/com.example.aidlservertest D/com.example.aidlservertest.AIDLService: onCreate
2021-03-03 18:16:38.762 17934-17952/com.example.aidlservertest D/com.example.aidlservertest.AIDLService: s = 11111
2021-03-03 18:16:38.762 17988-17988/com.example.aidlclienttest D/com.example.aidlclienttest.MainActivity: testName:=我是com.example.aidlservertest.AIDLService回傳的字串
最后,這里只是簡單的寫個demo記錄下,其實里面還有很多東西遠不止這么多,有時間可以去學習看下,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/265947.html
標籤:其他
上一篇:lex1.yy.c(12) : fatal error C1083: 無法打開包括檔案:“stdio.h” :No such file or directory
