1.通过广播来操作写数据库
在一个项目中,Activity和子进程的Service想要访问同一个数据库,可能会造成多线程访问数据异常,目前我的解决方案是Service发送广播,然后BroadcastReceiver接收到广播后再写入数据库,如果需要读的话,可能还是需要走aidl进行数据读写。
Service.java
Intent intent = new Intent("com.test.sms"); intent.putExtra("message", JSON.toJSONString(data)); getApplicationContext().sendBroadcast(intent);
BroadcastReceiver.java
public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("com.test.sms")) { //... } }
Manifest.xml
<receiver android:name=".services.MyReceiver"> <intent-filter> <action android:name="com.langtian.sms"/> </intent-filter> </receiver>
2.aidl来处理多进程之间的数据访问
Android Studio先从左侧Project中新建aidl,然后重新Build项目,可在app/build/generated/source/aidl/debug/packname/中找到AS自动生成的aidl接口。
将接口复制到需要通讯项目中(client)。
以下是在Activity中的调用代码:
Activity.java
ServiceConnection connection= new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyAidlInterface aidl=IMyAidlInterface.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }; Intent intent = new Intent("com.service.MyService"); AppData.context.bindService(intent, connection, Context.BIND_AUTO_CREATE);
Service.java
private MyThread thread; public class MyBinder extends IMyAidlInterface.Stub { //实现aidl接口 public MsgServices getService() { return MyServices.this; } @Override public String getData()throws RemoteException{ String str=JSON.toJSONString(getData()); return str; } } @Nullable @Override public IBinder onBind(Intent intent) { return binder; }
IMyAidlInterface.aidl
interface IMyAidlInterface { String getData(); }
服务启动后,通过aidl接口即可进行对多进程Service调用了,值得注意的是,aidl仅接受标准数据类型,且传输大小不得超过1M。