上一篇链接:android studio AIDL的使用(一)简单使用
1.全部代码:
1.java代码
Message :
package com.kunminx.exampleaidlmukewang.entity;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable.Creator;
/**
* @ClassName Message
* @Description TODO
* @Author ${孙伟豪}
* @Date 2020/11/6 14:54
* @Version 1.0
*/
public class Message implements Parcelable {//实现序列化,不然不行
private String content;//发送的内容
private boolean isSendSuccess;//发送的状态
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.content);
dest.writeByte(this.isSendSuccess ? (byte) 1 : (byte) 0);
}
public Message() {
}
protected Message(Parcel in) {
this.content = in.readString();
this.isSendSuccess = in.readByte() != 0;
}
public static final Creator<Message> CREATOR = new Creator<Message>() {
@Override
public Message createFromParcel(Parcel source) {
return new Message(source);
}
@Override
public Message[] newArray(int size) {
return new Message[size];
}
};
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;
}
}
MainActivity
package com.kunminx.exampleaidlmukewang;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.kunminx.exampleaidlmukewang.entity.Message;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtConect;
private Button mBtDisconnect;
private Button mBtIsConnected;
private IConnectionService connectionServiceProxy;
private IServiceManager serviceManagerProxy;
private IMessageService messageServiceProxy;
private Button mBtSendMessage;
private Button mBtRegisterListener;
private Button mBtUnregister;
/**IPC
* 对AIDL创建的类的方法的实现
* remoteService对main方法的调用,相当于反向调用
*/
private MessageReceiverListener messageReceiverListener=new MessageReceiverListener.Stub() {
@Override
public void onReceiveMessage(final Message message) throws RemoteException {
new Handler(Looper.getMainLooper()).post(new Runnable() {//实现方法
@Override
public void run() {
Toast.makeText(MainActivity.this, message.getContent(), Toast.LENGTH_SHORT).show();
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
Intent mIntent = new Intent(this, RemoteService.class);
bindService(mIntent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serviceManagerProxy = IServiceManager.Stub.asInterface(service);//获取代理
try {
//获取连接代理
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) {
}
}, BIND_AUTO_CREATE);
}
private void initView() {
mBtConect = (Button) findViewById(R.id.bt_conect);
mBtDisconnect = (Button) findViewById(R.id.bt_disconnect);
mBtIsConnected = (Button) findViewById(R.id.bt_isConnected);
mBtSendMessage = (Button) findViewById(R.id.bt_send_message);
mBtRegisterListener = (Button) findViewById(R.id.bt_register_listener);
mBtUnregister = (Button) findViewById(R.id.bt_unregister);
mBtConect.setOnClickListener(this);
mBtDisconnect.setOnClickListener(this);
mBtIsConnected.setOnClickListener(this);
mBtSendMessage.setOnClickListener(this);
mBtRegisterListener.setOnClickListener(this);
mBtUnregister.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_conect:
try {
connectionServiceProxy.connect();
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.bt_disconnect:
try {
connectionServiceProxy.disconnect();
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.bt_isConnected:
boolean isConnection = false;
try {
isConnection = connectionServiceProxy.isConnection();
} catch (RemoteException e) {
e.printStackTrace();
}
Toast.makeText(this, String.valueOf(isConnection), Toast.LENGTH_SHORT).show();
break;
case R.id.bt_send_message:
Message message=new Message();
message.setContent("这个消息来自main");
try {
messageServiceProxy.sendMessage(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.bt_register_listener:
try {
messageServiceProxy.registerMessageReceiveListener(messageReceiverListener);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.bt_unregister:
try {
messageServiceProxy.unRegisterMessageReceiveListener(messageReceiverListener);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
}
RemoteService
package com.kunminx.exampleaidlmukewang;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.widget.Toast;
import com.kunminx.exampleaidlmukewang.entity.Message;
import java.util.ArrayList;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class RemoteService extends Service {
private boolean isConnected = false;
//用arrayList来储存消息的监听
private ArrayList<MessageReceiverListener> messageReceiverListenerArrayList = new ArrayList<>();
private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
//模拟消息接收的过程,通过定时任务
private ScheduledFuture scheduledFuture;
public RemoteService() {
}
private Handler handler = new Handler(Looper.getMainLooper());
//注意:下面这些都是运行在子线程中的,所有Toast要线程通信
private IConnectionService connectionService = new IConnectionService.Stub() {
@Override
public void connect() throws RemoteException {
try {
Thread.sleep(5000);
isConnected = true;
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(RemoteService.this, "connect", Toast.LENGTH_SHORT).show();
}
});
//单位:s
scheduledFuture = scheduledThreadPoolExecutor.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
//遍历消息接收的监听
for (MessageReceiverListener messageReceiverListener : messageReceiverListenerArrayList) {
Message message = new Message();
message.setContent("这个消息来自remoteService");
try {
messageReceiverListener.onReceiveMessage(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}//执行的方法
, 5000//第一次执行的时间
, 5000//执行时间间隔
, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void disconnect() throws RemoteException {
isConnected = false;
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(RemoteService.this, "idsconnect", Toast.LENGTH_SHORT).show();
}
});
//断联后把定时任务停掉
scheduledFuture.cancel(true);
}
@Override
public boolean isConnection() throws RemoteException {
return isConnected;
}
};
//消息服务
private IMessageService messageService = new IMessageService.Stub() {
@Override
public void sendMessage(final Message message) throws RemoteException {
//打印消息内容
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(RemoteService.this, message.getContent(), Toast.LENGTH_SHORT).show();
}
});
if (isConnected) {
message.setSendSuccess(true);
} else {
message.setSendSuccess(false);
}
}
@Override
public void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
if (messageReceiverListener != null) {//如果消息监听不为空,就把它添加进来(注册)
messageReceiverListenerArrayList.add(messageReceiverListener);
}
}
@Override
public void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
if (messageReceiverListener != null) {//取消注册
messageReceiverListenerArrayList.remove(messageReceiverListener);
}
}
};
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;
}
}
};
@Override
public IBinder onBind(Intent intent) {
return serviceManager.asBinder();
}
@Override
public void onCreate() {
super.onCreate();
scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
}
}
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"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/bt_conect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="connect" />
<Button
android:id="@+id/bt_disconnect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="disconnect" />
<Button
android:id="@+id/bt_isConnected"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="isConnected" />
<Button
android:id="@+id/bt_send_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="send" />
<Button
android:id="@+id/bt_register_listener"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="register" />
<Button
android:id="@+id/bt_unregister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="unregister" />
</LinearLayout>
2.AIDL代码:
Message
// Message.aidl
//修改包名,因为他是在entity下的
//package com.kunminx.exampleaidlmukewang;
package com.kunminx.exampleaidlmukewang.entity;//包名与java上的要保持一致
parcelable Message;//这句话就让源码上的Message与AIDL上的Message进行了关联。这里AIDL文件上是无法直接调用java文件Message的,所以创建两个,进行关联
//因为是一个实体类,不是接口,所以把接口去掉
//interface Message {
//
//}
IConnectionService
// IConnectionService.aidl
package com.kunminx.exampleaidlmukewang;
// 连接服务
interface IConnectionService {
//oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
//不能设置返回值
oneway void connect();//连接
void disconnect();//断开连接
boolean isConnection();//获取连接状态
}
IMessageService
// IMessageService.aidl
package com.kunminx.exampleaidlmukewang;
//要使用AIDL上的Message就要import进来(自己写)
import com.kunminx.exampleaidlmukewang.entity.Message;
import com.kunminx.exampleaidlmukewang.MessageReceiverListener;
/*
消息服务
*/
interface IMessageService {
//实体类前面要有一个in关键字,基本类型不需要
void sendMessage(in Message message);
//注册
void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener);//接口不用
//取消注册
void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener);
}
IServiceManager
// IServiceManager.aidl
package com.kunminx.exampleaidlmukewang;
interface IServiceManager {
IBinder getService(String serviceName);//根据名字获取aidl生成类
}
MessageReceiverListener
// MessageReceiverListener.aidl
package com.kunminx.exampleaidlmukewang;
import com.kunminx.exampleaidlmukewang.entity.Message;
/*
消息的监听
*/
interface MessageReceiverListener {
//搜到消息的回调
void onReceiveMessage(in Message message);
}
3.AIDL生成的代码
IConnectionService
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
// 连接服务
public interface IConnectionService extends android.os.IInterface
{
/** Default implementation for IConnectionService. */
public static class Default implements com.kunminx.exampleaidlmukewang.IConnectionService
{
//oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
//不能设置返回值
@Override public void connect() throws android.os.RemoteException
{
}
//连接
@Override public void disconnect() throws android.os.RemoteException
{
}
//断开连接
@Override public boolean isConnection() throws android.os.RemoteException
{
return false;
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IConnectionService
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IConnectionService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IConnectionService interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.IConnectionService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IConnectionService))) {
return ((com.kunminx.exampleaidlmukewang.IConnectionService)iin);
}
return new com.kunminx.exampleaidlmukewang.IConnectionService.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_connect:
{
data.enforceInterface(descriptor);
this.connect();
return true;
}
case TRANSACTION_disconnect:
{
data.enforceInterface(descriptor);
this.disconnect();
reply.writeNoException();
return true;
}
case TRANSACTION_isConnection:
{
data.enforceInterface(descriptor);
boolean _result = this.isConnection();
reply.writeNoException();
reply.writeInt(((_result)?(1):(0)));
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.IConnectionService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
//oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
//不能设置返回值
@Override public void connect() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
boolean _status = mRemote.transact(Stub.TRANSACTION_connect, _data, null, android.os.IBinder.FLAG_ONEWAY);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().connect();
return;
}
}
finally {
_data.recycle();
}
}
//连接
@Override public void disconnect() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
boolean _status = mRemote.transact(Stub.TRANSACTION_disconnect, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().disconnect();
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
//断开连接
@Override public boolean isConnection() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
boolean _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
boolean _status = mRemote.transact(Stub.TRANSACTION_isConnection, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
return getDefaultImpl().isConnection();
}
_reply.readException();
_result = (0!=_reply.readInt());
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
public static com.kunminx.exampleaidlmukewang.IConnectionService sDefaultImpl;
}
static final int TRANSACTION_connect = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_disconnect = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_isConnection = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IConnectionService impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.IConnectionService getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
//oneway 关键字后,主进程能向子进程调用方法且不会影响主进程
//不能设置返回值
public void connect() throws android.os.RemoteException;
//连接
public void disconnect() throws android.os.RemoteException;
//断开连接
public boolean isConnection() throws android.os.RemoteException;
}
IMessageService
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
/*
消息服务
*/
public interface IMessageService extends android.os.IInterface
{
/** Default implementation for IMessageService. */
public static class Default implements com.kunminx.exampleaidlmukewang.IMessageService
{
//实体类前面要有一个in关键字,基本类型不需要
@Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
}
//注册
@Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
}
//接口不用
//取消注册
@Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IMessageService
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IMessageService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IMessageService interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.IMessageService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IMessageService))) {
return ((com.kunminx.exampleaidlmukewang.IMessageService)iin);
}
return new com.kunminx.exampleaidlmukewang.IMessageService.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_sendMessage:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.entity.Message _arg0;
if ((0!=data.readInt())) {
_arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
this.sendMessage(_arg0);
reply.writeNoException();
return true;
}
case TRANSACTION_registerMessageReceiveListener:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
_arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
this.registerMessageReceiveListener(_arg0);
reply.writeNoException();
return true;
}
case TRANSACTION_unRegisterMessageReceiveListener:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
_arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
this.unRegisterMessageReceiveListener(_arg0);
reply.writeNoException();
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.IMessageService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
//实体类前面要有一个in关键字,基本类型不需要
@Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((message!=null)) {
_data.writeInt(1);
message.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
boolean _status = mRemote.transact(Stub.TRANSACTION_sendMessage, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().sendMessage(message);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
//注册
@Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
boolean _status = mRemote.transact(Stub.TRANSACTION_registerMessageReceiveListener, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().registerMessageReceiveListener(messageReceiverListener);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
//接口不用
//取消注册
@Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
boolean _status = mRemote.transact(Stub.TRANSACTION_unRegisterMessageReceiveListener, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().unRegisterMessageReceiveListener(messageReceiverListener);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
public static com.kunminx.exampleaidlmukewang.IMessageService sDefaultImpl;
}
static final int TRANSACTION_sendMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_registerMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_unRegisterMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IMessageService impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.IMessageService getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
//实体类前面要有一个in关键字,基本类型不需要
public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
//注册
public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
//接口不用
//取消注册
public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
}
IServiceManager
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
public interface IServiceManager extends android.os.IInterface
{
/** Default implementation for IServiceManager. */
public static class Default implements com.kunminx.exampleaidlmukewang.IServiceManager
{
@Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
{
return null;
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IServiceManager
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IServiceManager";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IServiceManager interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.IServiceManager asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IServiceManager))) {
return ((com.kunminx.exampleaidlmukewang.IServiceManager)iin);
}
return new com.kunminx.exampleaidlmukewang.IServiceManager.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_getService:
{
data.enforceInterface(descriptor);
java.lang.String _arg0;
_arg0 = data.readString();
android.os.IBinder _result = this.getService(_arg0);
reply.writeNoException();
reply.writeStrongBinder(_result);
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.IServiceManager
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
android.os.IBinder _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(serviceName);
boolean _status = mRemote.transact(Stub.TRANSACTION_getService, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
return getDefaultImpl().getService(serviceName);
}
_reply.readException();
_result = _reply.readStrongBinder();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
public static com.kunminx.exampleaidlmukewang.IServiceManager sDefaultImpl;
}
static final int TRANSACTION_getService = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IServiceManager impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.IServiceManager getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException;
}
MessageReceiverListener
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
/*
消息的监听
*/
public interface MessageReceiverListener extends android.os.IInterface
{
/** Default implementation for MessageReceiverListener. */
public static class Default implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
{
//搜到消息的回调
@Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.MessageReceiverListener";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.MessageReceiverListener interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.MessageReceiverListener asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.MessageReceiverListener))) {
return ((com.kunminx.exampleaidlmukewang.MessageReceiverListener)iin);
}
return new com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_onReceiveMessage:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.entity.Message _arg0;
if ((0!=data.readInt())) {
_arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
this.onReceiveMessage(_arg0);
reply.writeNoException();
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
//搜到消息的回调
@Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((message!=null)) {
_data.writeInt(1);
message.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
boolean _status = mRemote.transact(Stub.TRANSACTION_onReceiveMessage, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().onReceiveMessage(message);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
public static com.kunminx.exampleaidlmukewang.MessageReceiverListener sDefaultImpl;
}
static final int TRANSACTION_onReceiveMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.MessageReceiverListener impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.MessageReceiverListener getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
//搜到消息的回调
public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
}
2.步骤:
1.创建bean类Message,实现序列化与getter和setter方法
序列化:用下面这个插件,可以自己去下载安装。然后在getter和setter方法,实现两个就行
代码:
/**
* @ClassName Message
* @Description TODO
* @Author ${孙伟豪}
* @Date 2020/11/6 14:54
* @Version 1.0
*/
public class Message implements Parcelable {//实现序列化,不然不行
private String content;//发送的内容
private boolean isSendSuccess;//发送的状态
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.content);
dest.writeByte(this.isSendSuccess ? (byte) 1 : (byte) 0);
}
public Message() {
}
protected Message(Parcel in) {
this.content = in.readString();
this.isSendSuccess = in.readByte() != 0;
}
public static final Creator<Message> CREATOR = new Creator<Message>() {
@Override
public Message createFromParcel(Parcel source) {
return new Message(source);
}
@Override
public Message[] newArray(int size) {
return new Message[size];
}
};
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;
}
}
2.创建AIDL文件Message,用于关联Message
//修改包名,因为他是在entity下的
//package com.kunminx.exampleaidlmukewang;
package com.kunminx.exampleaidlmukewang.entity;//包名与java上的要保持一致
parcelable Message;//这句话就让源码上的Message与AIDL上的Message进行了关联。这里AIDL文件上是无法直接调用java文件Message的,所以创建两个,进行关联
//因为是一个实体类,不是接口,所以把接口去掉
//interface Message {
//
//}
这里Message.java与Message.aidl包名路径要一致,不然会不行
3.创建消息接收监听类
// MessageReceiverListener.aidl
package com.kunminx.exampleaidlmukewang;
import com.kunminx.exampleaidlmukewang.entity.Message;
/*
消息的监听
*/
interface MessageReceiverListener {
//搜到消息的回调
void onReceiveMessage(in Message message);
}
自己导包
4.创建消息服务AIDL类
// IMessageService.aidl
package com.kunminx.exampleaidlmukewang;
//要使用AIDL上的Message就要import进来(自己写)
import com.kunminx.exampleaidlmukewang.entity.Message;
import com.kunminx.exampleaidlmukewang.MessageReceiverListener;
/*
消息服务
*/
interface IMessageService {
//实体类前面要有一个in关键字,基本类型不需要
void sendMessage(in Message message);
//注册
void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener);//接口不用
//取消注册
void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener);
}
5.![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2d420f5497d0e36a9f2c9e10e40869c4.png)
6.生成的类
生成类的代码
IMessageService :
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
/*
消息服务
*/
public interface IMessageService extends android.os.IInterface
{
/** Default implementation for IMessageService. */
public static class Default implements com.kunminx.exampleaidlmukewang.IMessageService
{
//实体类前面要有一个in关键字,基本类型不需要
@Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
}
//注册
@Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
}
//接口不用
//取消注册
@Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IMessageService
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IMessageService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IMessageService interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.IMessageService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IMessageService))) {
return ((com.kunminx.exampleaidlmukewang.IMessageService)iin);
}
return new com.kunminx.exampleaidlmukewang.IMessageService.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_sendMessage:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.entity.Message _arg0;
if ((0!=data.readInt())) {
_arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
this.sendMessage(_arg0);
reply.writeNoException();
return true;
}
case TRANSACTION_registerMessageReceiveListener:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
_arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
this.registerMessageReceiveListener(_arg0);
reply.writeNoException();
return true;
}
case TRANSACTION_unRegisterMessageReceiveListener:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.MessageReceiverListener _arg0;
_arg0 = com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.asInterface(data.readStrongBinder());
this.unRegisterMessageReceiveListener(_arg0);
reply.writeNoException();
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.IMessageService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
//实体类前面要有一个in关键字,基本类型不需要
@Override public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((message!=null)) {
_data.writeInt(1);
message.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
boolean _status = mRemote.transact(Stub.TRANSACTION_sendMessage, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().sendMessage(message);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
//注册
@Override public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
boolean _status = mRemote.transact(Stub.TRANSACTION_registerMessageReceiveListener, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().registerMessageReceiveListener(messageReceiverListener);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
//接口不用
//取消注册
@Override public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStrongBinder((((messageReceiverListener!=null))?(messageReceiverListener.asBinder()):(null)));
boolean _status = mRemote.transact(Stub.TRANSACTION_unRegisterMessageReceiveListener, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().unRegisterMessageReceiveListener(messageReceiverListener);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
public static com.kunminx.exampleaidlmukewang.IMessageService sDefaultImpl;
}
static final int TRANSACTION_sendMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_registerMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
static final int TRANSACTION_unRegisterMessageReceiveListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IMessageService impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.IMessageService getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
//实体类前面要有一个in关键字,基本类型不需要
public void sendMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
//注册
public void registerMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
//接口不用
//取消注册
public void unRegisterMessageReceiveListener(com.kunminx.exampleaidlmukewang.MessageReceiverListener messageReceiverListener) throws android.os.RemoteException;
}
MessageReceiverListener :
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
/*
消息的监听
*/
public interface MessageReceiverListener extends android.os.IInterface
{
/** Default implementation for MessageReceiverListener. */
public static class Default implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
{
//搜到消息的回调
@Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.MessageReceiverListener";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.MessageReceiverListener interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.MessageReceiverListener asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.MessageReceiverListener))) {
return ((com.kunminx.exampleaidlmukewang.MessageReceiverListener)iin);
}
return new com.kunminx.exampleaidlmukewang.MessageReceiverListener.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_onReceiveMessage:
{
data.enforceInterface(descriptor);
com.kunminx.exampleaidlmukewang.entity.Message _arg0;
if ((0!=data.readInt())) {
_arg0 = com.kunminx.exampleaidlmukewang.entity.Message.CREATOR.createFromParcel(data);
}
else {
_arg0 = null;
}
this.onReceiveMessage(_arg0);
reply.writeNoException();
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.MessageReceiverListener
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
//搜到消息的回调
@Override public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((message!=null)) {
_data.writeInt(1);
message.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
boolean _status = mRemote.transact(Stub.TRANSACTION_onReceiveMessage, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
getDefaultImpl().onReceiveMessage(message);
return;
}
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
public static com.kunminx.exampleaidlmukewang.MessageReceiverListener sDefaultImpl;
}
static final int TRANSACTION_onReceiveMessage = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.MessageReceiverListener impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.MessageReceiverListener getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
//搜到消息的回调
public void onReceiveMessage(com.kunminx.exampleaidlmukewang.entity.Message message) throws android.os.RemoteException;
}
7.在RemoteService实现消息服务
//消息服务
private IMessageService messageService = new IMessageService.Stub() {
@Override
public void sendMessage(final Message message) throws RemoteException {
//打印消息内容
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(RemoteService.this, message.getContent(), Toast.LENGTH_SHORT).show();
}
});
if (isConnected) {//如果连接
message.setSendSuccess(true);//设置返回结果为true
} else {
message.setSendSuccess(false);
}
}
@Override
public void registerMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
if (messageReceiverListener != null) {//如果消息监听不为空,就把它添加进来(注册)
messageReceiverListenerArrayList.add(messageReceiverListener);
}
}
@Override
public void unRegisterMessageReceiveListener(MessageReceiverListener messageReceiverListener) throws RemoteException {
if (messageReceiverListener != null) {//取消注册
messageReceiverListenerArrayList.remove(messageReceiverListener);
}
}
};
1.问题:
2.解决:
- 创建一个返回ADIL生成的类的处理者,它可以根据传入名获取想要的AIDL生成的类
// IServiceManager.aidl
package com.kunminx.exampleaidlmukewang;
interface IServiceManager {
IBinder getService(String serviceName);//根据名字获取aidl生成类
}
8.编译![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d10954845ab3d8c170c5b7a38fea4911.png)
生成类的代码:
IServiceManager :
/*
* This file is auto-generated. DO NOT MODIFY.
*/
package com.kunminx.exampleaidlmukewang;
public interface IServiceManager extends android.os.IInterface
{
/** Default implementation for IServiceManager. */
public static class Default implements com.kunminx.exampleaidlmukewang.IServiceManager
{
@Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
{
return null;
}
@Override
public android.os.IBinder asBinder() {
return null;
}
}
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.kunminx.exampleaidlmukewang.IServiceManager
{
private static final java.lang.String DESCRIPTOR = "com.kunminx.exampleaidlmukewang.IServiceManager";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an com.kunminx.exampleaidlmukewang.IServiceManager interface,
* generating a proxy if needed.
*/
public static com.kunminx.exampleaidlmukewang.IServiceManager asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.kunminx.exampleaidlmukewang.IServiceManager))) {
return ((com.kunminx.exampleaidlmukewang.IServiceManager)iin);
}
return new com.kunminx.exampleaidlmukewang.IServiceManager.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
java.lang.String descriptor = DESCRIPTOR;
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(descriptor);
return true;
}
case TRANSACTION_getService:
{
data.enforceInterface(descriptor);
java.lang.String _arg0;
_arg0 = data.readString();
android.os.IBinder _result = this.getService(_arg0);
reply.writeNoException();
reply.writeStrongBinder(_result);
return true;
}
default:
{
return super.onTransact(code, data, reply, flags);
}
}
}
private static class Proxy implements com.kunminx.exampleaidlmukewang.IServiceManager
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
android.os.IBinder _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(serviceName);
boolean _status = mRemote.transact(Stub.TRANSACTION_getService, _data, _reply, 0);
if (!_status && getDefaultImpl() != null) {
return getDefaultImpl().getService(serviceName);
}
_reply.readException();
_result = _reply.readStrongBinder();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
public static com.kunminx.exampleaidlmukewang.IServiceManager sDefaultImpl;
}
static final int TRANSACTION_getService = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
public static boolean setDefaultImpl(com.kunminx.exampleaidlmukewang.IServiceManager impl) {
// Only one user of this interface can use this function
// at a time. This is a heuristic to detect if two different
// users in the same process use this function.
if (Stub.Proxy.sDefaultImpl != null) {
throw new IllegalStateException("setDefaultImpl() called twice");
}
if (impl != null) {
Stub.Proxy.sDefaultImpl = impl;
return true;
}
return false;
}
public static com.kunminx.exampleaidlmukewang.IServiceManager getDefaultImpl() {
return Stub.Proxy.sDefaultImpl;
}
}
public android.os.IBinder getService(java.lang.String serviceName) throws android.os.RemoteException;
}
9.在Remote中实现IServiceManager
private IServiceManager serviceManager=new IServiceManager.Stub() {
@Override
public IBinder getService(String serviceName) throws RemoteException {
//根据传入的名字来获取对应的AIDL生成的对象
if (IConnectionService.class.getSimpleName().equals(serviceName)) {
return connectionService.asBinder();
}else if (IMessageService.class.getSimpleName().equals(serviceName)){
return messageService.asBinder();
}else {
return null;
}
}
};
10.修改一下返回的值
11.通过定时任务,模拟消息接收过程
这里是每五秒进行一次
//成员变量
private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
//模拟消息接收的过程,通过定时任务
private ScheduledFuture scheduledFuture;
初始化:重写onCreate方法
@Override
public void onCreate() {
super.onCreate();
scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
}
//单位:s
scheduledFuture = scheduledThreadPoolExecutor.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
//遍历消息接收的监听
for (MessageReceiverListener messageReceiverListener : messageReceiverListenerArrayList) {
Message message = new Message();
message.setContent("这个消息来自remoteService");
try {
messageReceiverListener.onReceiveMessage(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}//执行的方法
, 5000//第一次执行的时间
, 5000//执行时间间隔
, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
12.MainActivity实现MessageReceiverListener方法
之前都是在remoteService实现,在MainActivity里面调用,这里AIDL创建的类是在MainActivity里面实现的,他被remoteService调用
/**IPC
* 对AIDL创建的类的方法的实现
* remoteService对main方法的调用,相当于反向调用
*/
private MessageReceiverListener messageReceiverListener=new MessageReceiverListener.Stub() {
@Override
public void onReceiveMessage(final Message message) throws RemoteException {
new Handler(Looper.getMainLooper()).post(new Runnable() {//实现方法
@Override
public void run() {
Toast.makeText(MainActivity.this, message.getContent(), Toast.LENGTH_SHORT).show();
}
});
}
};
13.初始化代理,获得连接,消息代理
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
Intent mIntent = new Intent(this, RemoteService.class);
bindService(mIntent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serviceManagerProxy = IServiceManager.Stub.asInterface(service);//获取代理
try {
//获取连接代理
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) {
}
}, BIND_AUTO_CREATE);
}
14.调用方法
case R.id.bt_send_message:
Message message=new Message();
message.setContent("这个消息来自main");
try {
messageServiceProxy.sendMessage(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.bt_register_listener:
try {
messageServiceProxy.registerMessageReceiveListener(messageReceiverListener);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.bt_unregister:
try {
messageServiceProxy.unRegisterMessageReceiveListener(messageReceiverListener);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
15.问题,unRegisterMessage,它还是一直执行
解决办法:下一篇再来,写太多了
3.总结与反思:
1.图解
IMessageService
IMessageReceiverListener