俩个aidl文件:
interface IListener {
void sendMsgtoClient(String msg);
}
interface ICallback {
void setListener(IListener lst);
void sendMSGtoService(String msg);
}
MyService:
public class MyService extends Service {
private static final String TAG = "aidltest";
private IListener listener;
int anInt = 0;
@Override
public void onCreate() {
super.onCreate();
Loge.e(String.valueOf(android.os.Process.myPid()) + ":MyService");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return (IBinder) iCallback;
}
ICallback iCallback = new ICallback.Stub() {
@Override
public void setListener(IListener lst) throws RemoteException {
listener = lst;
ExecutorUtil.execute(new Runnable() {
@Override
public void run() {
while (true) {
try {
if (listener != null) {
listener.sendMsgtoClient("服务器发消息" + anInt++);
} else {
break;
}
} catch (RemoteException e) {
e.printStackTrace();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
@Override
public void sendMSGtoService(String msg) throws RemoteException {
Loge.e("来自客户端的消息:" + msg);
}
};
@Override
public boolean onUnbind(Intent intent) {
Loge.e("onUnbind");
listener = null;
iCallback = null;
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Loge.e("onDestroy");
super.onDestroy();
listener = null;
iCallback = null;
}
}
Fragment 客户端:
public class Fragment_06 extends WebViewBottomSheetDialogFragment {
TestBottomsheetfragmentBinding binding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = TestBottomsheetfragmentBinding.inflate(inflater);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Intent intent = new Intent();
intent.setAction("com.MyService");
intent.setPackage(Test2_App.getInstance().getPackageName());
binding.test6FragmentBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Loge.e(String.valueOf(android.os.Process.myPid()) + ":Fragment_06");
getActivity().bindService(intent, serviceConnection, Activity.BIND_AUTO_CREATE);
}
});
binding.test6FragmentBtn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().stopService(intent);
if (connect) {
getActivity().unbindService(serviceConnection);
connect = false;
iCallback = null;
}
}
});
}
boolean connect = false;
ServiceConnection serviceConnection;
ICallback iCallback;
int anInt = 0;
@Override
public void onResume() {
super.onResume();
serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
connect = true;
iCallback = ICallback.Stub.asInterface(service);
ExecutorUtil.execute(new Runnable() {
@Override
public void run() {
while (true) {
try {
if (iCallback != null) {
iCallback.sendMSGtoService("发消息到服务器" + anInt++);
} else {
break;
}
} catch (RemoteException e) {
e.printStackTrace();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
try {
iCallback.setListener(new IListener.Stub() {
@Override
public void sendMsgtoClient(String msg) throws RemoteException {
Loge.e("来自服务器的消息" + msg);
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Loge.e("断开连接");
connect = false;
iCallback = null;
}
};
}
}
清单注册 MyService:
<service
android:name=".test6.test_fragment.test06.MyService"
android:process=":myservice"
android:exported="true">
<intent-filter>
<!-- AIDL完整路径名。必须指明,客户端能够通过AIDL类名查找到它的实现类 -->
<action android:name="com.MyService" />
</intent-filter>
</service>
<service android:name=".test5.fragment6.TestAppWidgetRemoteViewsService" />
直接复制就能用。