首先创建数据库添加信息
package net.bwie.aidlserver.sqlite; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { public static final String DB_NAME = "my_db.db";// 数据库文件名 public static final String TABLE_NAME = "t_person";// 表名 public static final int DB_VERSION = 1;// 数据库版本号 public static final String NAME = "name"; public DBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } // 初始化数据库 @Override public void onCreate(SQLiteDatabase db) { // 建表 String createTableSQL = "create table if not exists " + TABLE_NAME + "(_id integer primary key autoincrement, "+ NAME +" varchar)"; db.execSQL(createTableSQL); // 初始化10条数据 for (int i = 0; i < 10; i++) { ContentValues values = new ContentValues(); values.put(NAME, "姓名" + i); db.insert(TABLE_NAME, null, values); } } // 数据库版本更新 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
创建AIDL
package net.bwie.aidlserver; interface IPersonInterface { String[] queryNames(); }
服务
package net.bwie.aidlserver.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import net.bwie.aidlserver.aidl.MyBinder; public class PersonService extends Service { public PersonService() { } @Override public IBinder onBind(Intent intent) { return new MyBinder(this); } }
其次
package net.bwie.aidlserver.aidl; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.RemoteException; import net.bwie.aidlserver.IPersonInterface; import net.bwie.aidlserver.sqlite.DBHelper; import java.util.ArrayList; import java.util.List; /** * 把MyBinder定义为Service中的内部类后,使用static修饰会和context冲突 * 使用外部类解决该冲突的同时同样避免了内存泄漏 */ public class MyBinder extends IPersonInterface.Stub { private Context mContext; public MyBinder(Context context) { mContext = context; } @Override public String[] queryNames() throws RemoteException { // 获取数据库助手,通过助手获取数据库对应的对象 // 通过数据库查询数据,返回给客户端 DBHelper helper = new DBHelper(mContext); SQLiteDatabase database = helper.getWritableDatabase(); // 表名 // 查询的字段,null代表全查询 // 查询条件 // 满足查询的条件 // 分组 // 分组筛选关键字 // 排序 Cursor cursor = database.query(DBHelper.TABLE_NAME, new String[]{DBHelper.NAME}, null, null, null, null, null); List<String> nameList = new ArrayList<>(); int nameIndex = cursor.getColumnIndex(DBHelper.NAME); while (cursor.moveToNext()) { String name = cursor.getString(nameIndex); nameList.add(name); } // 集合转成数组 String[] names = new String[nameList.size()]; for (int i = 0; i < nameList.size(); i++) { names[i] = nameList.get(i); } database.close(); cursor.close(); return names; } }
主界面
package net.bwie.aidlserver.activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import net.bwie.aidlserver.R; /** * 服务端 * 准备一个数据库 * 1、创建helper和相关数据库的初始化 * 2、插入10条数据 * 创建AIDL接口文件 * 创建Service实现查询数据库数据并返回给客户端 */ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
另一个对应的ADIL
<?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:orientation="vertical" android:layout_height="match_parent" tools:context="net.bwie.aidlclient.MainActivity"> <Button android:id="@+id/query_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询服务端数据库"/> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
package net.bwie.aidlclient; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import net.bwie.aidlserver.IPersonInterface; public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection { protected Button mQueryBtn; protected ListView mListView; // AIDL接口实例 private IPersonInterface mIPersonInterface; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); initView(); bindService(); } // 绑定服务端 private void bindService() { Intent intent = new Intent("query_person_action"); intent.setPackage("net.bwie.aidlserver"); boolean isBindSuccessful = bindService(intent, this, Context.BIND_AUTO_CREATE); Toast.makeText(this, "是否绑定成功:" + isBindSuccessful, Toast.LENGTH_SHORT).show(); } @Override public void onClick(View view) { if (view.getId() == R.id.query_btn) { String[] names = new String[0]; try { names = mIPersonInterface.queryNames(); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, names); mListView.setAdapter(adapter); } catch (RemoteException e) { e.printStackTrace(); } } } private void initView() { mQueryBtn = (Button) findViewById(R.id.query_btn); mQueryBtn.setOnClickListener(MainActivity.this); mListView = (ListView) findViewById(R.id.list_view); } @Override public void onServiceConnected(ComponentName name, IBinder iBinder) { // 将胶水转成AIDL实例 mIPersonInterface = IPersonInterface.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName name) { } }