上一篇说的是两个不同应用的简单传值
这回说一下在一个应用里的多进程通信
首先我们新建一个工程 我建了一个CDemo 工程
我们首先需要创建出一个新的进程,我们想让四大组件中的无论什么运行在一个新的进程,只要指定了android:process属性就可以啦
因为Activity之间不同进程传值上一篇说了,只需要Intent传值就可以,但是startActivityForResult方法是不好使的,只能用Intent再传回来,
所以这次我想要让Activity和Service之间传值.
首先我建一个Service 叫 MyService
注册表中如下
<service android:name=".MyService" android:process=":new"/> <!--:的意思是默认前方加了包名,或者直接在前方打上包名,否则会报错-->首先我们想实现的是Activity操作Service中的东西,往常我们用的是Binder ,但是跨进程的时候我们需要使用AIDL了
在main文件夹上右键,或者在包文件夹上右键 新建一个AIDL文件,我取名叫做MyAIDL,创建结束后,我们发现多了一个aidl文件夹和我们创建的文件. 文件中我们写上想要操作
Service的方法 MyAiDL接口文件中本来有的方法先删掉,写上我们的方法
如下
interface MyAIDL { void getData(); }AIDL文件没有代码提示,所以一切都要注意不要写错啦
这时我们需要在Build 中选取 make project
这时我们回到MyService中操作
将原先需要继承IBinder的MyBinder继承我们写的AIDL接口文件,是继承,不是实现 ,并复写方法
class MyBinder extends MyAIDL.Stub { @Override public void getData() throws RemoteException { Log.d("MyBinder", "我是服务里面的东东"); } }在这个方法中我们写我们想要做的事情
之后在Activity中初始化我们需要的ServiceConnection 和MyAIDL
private MyAIDL myAIDL; private ServiceConnection connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //初始化AIDL对象 myAIDL=MyAIDL.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { } };
然后我们在一个按钮的点击事件中绑定服务
Intent intent=new Intent(this,MyService.class); bindService(intent,connection,BIND_AUTO_CREATE);之后我们在另一个按钮的点击事件中调用服务中的方法
if (myAIDL!=null){ try { myAIDL.getData(); } catch (RemoteException e) { e.printStackTrace(); } }这时我们点击后会发现log在com.example.dllo.cdemo:new 进程中log打印出来了
只是一个log就不放图片了
这时我们Activty操作Service就完成了,但是数据传递还没有实现,下一篇再写,写一块我就乱了