服务端
首先在main右键新建一个AIDL文件,建完之后clear一下
在这里插入代码片
然后再新建一个Bean类和第一个键的AIDL文件名一样,一定先建AIDL不能先创建和AILD同名的java文件
Bean类 实现Parcelable序列化,再自己手写一个readFromParcel方法
package com.example.month2server;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
String mess;
public Book(String mess) {
this.mess = mess;
}
protected Book(Parcel in) {
mess = in.readString();
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
public String getMess() {
return mess;
}
public void setMess(String mess) {
this.mess = mess;
}
@Override
public String toString() {
return "Book{" +
"mess='" + mess + '\'' +
'}';
}
public void readFromParcel(Parcel parcel){
mess=parcel.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mess);
}
}
再把我们一开始的建的AIDL文件修改一下,然后clear一下
再建第二个AIDl文件定义我们自己想要的方法,把我们Bean类的包名导过来,然后clear一下
绑定服务类
package com.example.month2server;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class MyAIDLServer extends Service {
List<Book>books=new ArrayList<>();
MyAIDLInterface.Stub stub=new MyAIDLInterface.Stub() {
@Override
public List<Book> readMess() throws RemoteException {
return books;
}
@Override
public void wirteMess(Book book) throws RemoteException {
if(book!=null){
books.add(book);
Log.e("##",""+book.toString());
}
}
};
@Override
public void onCreate() {
super.onCreate();
Book book = new Book("今天遇见一只猴子");
books.add(book);
}
@Override
public IBinder onBind(Intent intent) {
return stub;
}
}
清单注册文件注册
<service android:name=".MyAIDLServer">
<intent-filter>
<action android:name="aldl"> </action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</service>
客户端 把服务端AIDL复制到客户端项目,clear一下,然后把服务端java包也给复制过来,放在同一级目录下,只留下Bean类
package com.example.month2;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.month2server.Book;
import com.example.month2server.MyAIDLInterface;
import java.util.List;
public class fragment3 extends Fragment {
MyAIDLInterface myAIDLInterface;
ServiceConnection serviceConnection=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myAIDLInterface=MyAIDLInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.frag3,container,false);
Button b_get=view.findViewById(R.id.get);
final TextView t_get=view.findViewById(R.id.getText);
Button b_post=view.findViewById(R.id.post);
final EditText e_post=view.findViewById(R.id.post_mess);
b_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
List<Book> books = myAIDLInterface.readMess();
t_get.setText(books.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
b_post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String s = e_post.getText().toString();
Book book = new Book(s);
try {
myAIDLInterface.wirteMess(book);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
BIND_Server();
return view;
}
private void BIND_Server() {
Intent intent = new Intent();
intent.setPackage("com.example.month2server");
intent.setAction("hhhh");
getContext().bindService(intent,serviceConnection,getContext().BIND_AUTO_CREATE);
}
}