远程Service及Sqlite示例
- 先创建RemoteServiceServer 远程Service服务端
- 新建一个aidl,并命名为IMyAidlInterface.aidl,文件里的代码如下:
// IMyAidlInterface.aidl
// 在新建的IMyAidlInterface.aidl里声明需要与Activity进行通信的方法
package com.dlrj.remoteserviceserver;
import com.dlrj.remoteserviceserver.StudentInfo;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
void AIDL_Service();
void setStudentInfos(in List<StudentInfo> studendNames);
void addStudentInfo(in StudentInfo studentInfo);
List<StudentInfo> getAllStudentInfos();
StudentInfo getStudentInfo(int id);
int getStudentId(String studentName);
int delete(int id, String name, String gender, int grade, int class_);
List<StudentInfo> queryByCondition(int id, String name, String gender, int grade, int class_);
}
//AIDL中支持以下的数据类型
//1. 基本数据类型
//2. String 和CharSequence
//3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型;
//4. AIDL自动生成的接口(需要导入-import)
//5. 实现android.os.Parcelable 接口的类(需要导入-import)
由于我们示例中传输的数据对象继承Parcelable,所以需要另外新建一个aidl,命名为StudentInfo.aidl,并且需要定义StudentInfo为parcelable类型,注意parcelable在aidl中必须小写
// StudentInfo.aidl
package com.dlrj.remoteserviceserver;
// Declare any non-default types here with import statements
parcelable StudentInfo;
StudentInfo代码实现如下:
package com.dlrj.remoteserviceserver;
import android.os.Parcel;
import android.os.Parcelable;
public class StudentInfo implements Parcelable {
private String name; //姓名
private int id; //学号
private String gender; //性别
private int grade; //年级
private int class_; //班级
public StudentInfo() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getClass_() {
return class_;
}
public void setClass_(int class_) {
this.class_ = class_;
}
// @Override
// public String toString() {
// return "book name:" + name;
// }
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeInt(id);
dest.writeString(gender);
dest.writeInt(grade);
dest.writeInt(class_);
}
public void readFromParcel(Parcel dest) {
name = dest.readString();
id = dest.readInt();
gender = dest.readString();
grade = dest.readInt();
class_ = dest.readInt();
}
protected StudentInfo(Parcel in) {
// this.name = in.readString();
// this.id = in.readInt();
// this.gender = in.readString();
// this.grade = in.readInt();
// this.class_ = in.readInt();
this.readFromParcel(in);
}
public static final Creator<StudentInfo> CREATOR = new Creator<StudentInfo>() {
@Override
public StudentInfo createFromParcel(Parcel source) {
return new StudentInfo(source);
}
@Override
public StudentInfo[] newArray(int size) {
return new StudentInfo[size];
}
};
}
- 新建一个Service,并命名为MyService,并在Service里面实现对sqlite数据库的操作,代码实现如下
package com.dlrj.remoteserviceserver;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class MyService extends Service {
private static final String LOG_PRINT_TAG = "MyService";
// private List<StudentInfo> studentNames = new ArrayList<StudentInfo>();
private DBHelper dbHelper = null;
IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {
@Override
public void AIDL_Service() throws RemoteException {
Log.e(LOG_PRINT_TAG, "客户端调用了IMyAidlInterface.Stub的AIDL_Service方法");
if (dbHelper == null) {
dbHelper = new DBHelper(getApplicationContext());
}
}
@Override
public void setStudentInfos(</