AIDL實作連接服務

AIDL實作訊息服務(客戶端→服務端)

AIDL實作訊息服務(服務端→客戶端)

Demo結構:
大家學習的時候注意要對應上我的Demo結構路徑,否則會出現找不到檔案的問題,如果你對AIDL檔案很熟悉的話,路徑可以隨自己喜歡選擇,

中間的 IConnectionService、IMessageService等等這塊區域的代碼是在Android Studio編譯時自動生成的
MyBean.aidl
package com.jlink.aidldemo.entity;
//對應java 中的MyBean
parcelable MyBean;
IConnectionService.aidl
package com.jlink.aidldemo;
//連接服務
interface IConnectionService {
//連接
oneway void connect();
//取消連接
void disconnect();
//連接狀態
boolean isConnected();
}
IMessageService.aidl
// IMessageService.aidl
package com.jlink.aidldemo;
import com.jlink.aidldemo.entity.MyBean;
import com.jlink.aidldemo.MessageReceiveListener;
//訊息服務
interface IMessageService {
//發送訊息
void sendMessage(in MyBean myBean);
//注冊訊息接收監聽器
void registerMessageReceiveListener(MessageReceiveListener messageReceiveListener);
//取消注冊訊息接收監聽器
void unRegisterMessageReceiveListener(MessageReceiveListener messageReceiveListener);
}
IServiceManager.aidl
package com.jlink.aidldemo;
interface IServiceManager {
IBinder getService(String serviceName);
}
MessageReceiveListener.aidl
// MessageReceiveListener.aidl
package com.jlink.aidldemo;
import com.jlink.aidldemo.entity.MyBean;
//訊息監聽器
interface MessageReceiveListener {
void onReceiveMessage(in MyBean myBean);
}
MyBean.java
public class MyBean implements android.os.Parcelable{
private String content; //內容
private boolean isSendSuccess; //狀態
public MyBean(){
}
protected MyBean(Parcel in) {
content = in.readString();
isSendSuccess = in.readByte() != 0;
}
public static final Creator<MyBean> CREATOR = new Creator<MyBean>() {
@Override
public MyBean createFromParcel(Parcel in) {
return new MyBean(in);
}
@Override
public MyBean[] newArray(int size) {
return new MyBean[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(content);
dest.writeByte((byte) (isSendSuccess ? 1 : 0));
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public boolean isSendSuccess() {
return isSendSuccess;
}
public void setSendSuccess(boolean sendSuccess) {
isSendSuccess = sendSuccess;
}
}
MyService.java
public class MyService extends Service {
private int num = 0;
public MyService(){
}
//RemoteCallbackList 存盤 訊息監聽器
private RemoteCallbackList<MessageReceiveListener> messageReceiveListenerRemoteCallbackList = new RemoteCallbackList<>();
//創建計時器
private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
//用來注銷計時器
private ScheduledFuture scheduledFuture;
@Override
public void onCreate() {
super.onCreate();
scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
}
private Handler handler = new Handler(Looper.getMainLooper());
private boolean isConnected = false;
private IConnectionService connectionService = new IConnectionService.Stub() {
@Override
public void connect() throws RemoteException {
isConnected = true;
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyService.this,"連接成功",Toast.LENGTH_SHORT).show();
}
});
scheduledFuture = scheduledThreadPoolExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
int size = messageReceiveListenerRemoteCallbackList.beginBroadcast();
num++;
for (int i=0; i<size; i++){
MyBean myBean = new MyBean();
myBean.setContent("噴火龍怒氣值:" + num);
try {
//服務端 → 客戶端
messageReceiveListenerRemoteCallbackList.getBroadcastItem(i).onReceiveMessage(myBean);
} catch (RemoteException e) {
e.printStackTrace();
}
}
messageReceiveListenerRemoteCallbackList.finishBroadcast();
}
},2000,2000, TimeUnit.MILLISECONDS);
}
@Override
public void disconnect() throws RemoteException {
isConnected = false;
//洗掉計時器
scheduledFuture.cancel(true);
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyService.this,"斷開連接",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean isConnected() throws RemoteException {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyService.this,String.valueOf(isConnected),Toast.LENGTH_SHORT).show();
}
});
return isConnected;
}
};
private IMessageService messageService = new IMessageService.Stub() {
@Override
public void sendMessage(MyBean myBean) throws RemoteException {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyService.this,String.valueOf(myBean.getContent()),Toast.LENGTH_SHORT).show();
}
});
if (isConnected){
myBean.setSendSuccess(true);
}else{
myBean.setSendSuccess(false);
}
}
@Override
public void registerMessageReceiveListener(MessageReceiveListener messageReceiveListener) throws RemoteException {
if (messageReceiveListener != null){
messageReceiveListenerRemoteCallbackList.register(messageReceiveListener);
}
}
@Override
public void unRegisterMessageReceiveListener(MessageReceiveListener messageReceiveListener) throws RemoteException {
if (messageReceiveListener != null){
messageReceiveListenerRemoteCallbackList.unregister(messageReceiveListener);
}
}
};
private IServiceManager serviceManager = new IServiceManager.Stub() {
@Override
public IBinder getService(String serviceName) throws RemoteException {
if (IConnectionService.class.getSimpleName().equals(serviceName)){
return connectionService.asBinder();
}else if (IMessageService.class.getSimpleName().equals(serviceName)){
return messageService.asBinder();
}else {
return null;
}
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return serviceManager.asBinder();
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnConnect,btnDisConnect,btnIsConnect;
private Button btnSendMessage,btnRegisterListener,btnUnregisterListener;
private IConnectionService connectionServiceProxy;
private IMessageService messageServiceProxy;
private IServiceManager serviceManagerProxy;
//監聽器的實作
private MessageReceiveListener messageReceiveListener = new MessageReceiveListener.Stub() {
@Override
public void onReceiveMessage(MyBean myBean) throws RemoteException {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,myBean.getContent(),Toast.LENGTH_SHORT).show();
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
Intent intent = new Intent(MainActivity.this,MyService.class);
bindService(intent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
try {
serviceManagerProxy = IServiceManager.Stub.asInterface(iBinder);
connectionServiceProxy = IConnectionService.Stub.asInterface(serviceManagerProxy.getService(IConnectionService.class.getSimpleName()));
messageServiceProxy = IMessageService.Stub.asInterface(serviceManagerProxy.getService(IMessageService.class.getSimpleName()));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}, Context.BIND_AUTO_CREATE);
}
private void init() {
btnConnect = findViewById(R.id.btn_connect);
btnDisConnect = findViewById(R.id.btn_disconnect);
btnIsConnect = findViewById(R.id.btn_is_connected);
btnSendMessage = findViewById(R.id.btn_send_message);
btnRegisterListener = findViewById(R.id.btn_register_listener);
btnUnregisterListener = findViewById(R.id.btn_unregister_listener);
btnIsConnect.setOnClickListener(this);
btnConnect.setOnClickListener(this);
btnDisConnect.setOnClickListener(this);
btnSendMessage.setOnClickListener(this);
btnRegisterListener.setOnClickListener(this);
btnUnregisterListener.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_connect:
try {
//連接
connectionServiceProxy.connect();
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_disconnect:
try {
//斷開連接
connectionServiceProxy.disconnect();
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_is_connected:
try {
//獲取連接狀態
boolean isConnected = connectionServiceProxy.isConnected();
Toast.makeText(MainActivity.this,String.valueOf(isConnected),Toast.LENGTH_SHORT).show();
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_send_message:
try {
//客戶端 → 服務端
MyBean myBean = new MyBean();
myBean.setContent("王睿對噴火龍使出了動感光波");
messageServiceProxy.sendMessage(myBean);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_register_listener:
try {
messageServiceProxy.registerMessageReceiveListener(messageReceiveListener);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_unregister_listener:
try {
messageServiceProxy.unRegisterMessageReceiveListener(messageReceiveListener);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="連接"/>
<Button
android:id="@+id/btn_disconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="取消連接"/>
<Button
android:id="@+id/btn_is_connected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="連接狀態"/>
<Button
android:id="@+id/btn_send_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="發送訊息"/>
<Button
android:id="@+id/btn_register_listener"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="注冊監聽器"/>
<Button
android:id="@+id/btn_unregister_listener"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="取消監聽器"/>
</LinearLayout>
Demo地址:
鏈接:https://pan.baidu.com/s/1JHmCOeRIjGaVnwuA8RB2Jw
提取碼:u5xh
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/303080.html
標籤:其他
