使用binder-AIDL进行跨进程通信
博客专区 > tnjin 的博客 > 博客详情
使用binder-AIDL进行跨进程通信
tnjin 发表于3年前
使用binder-AIDL进行跨进程通信
  • 发表于 3年前
  • 阅读 18
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 跨进程的binder通信即是使用AIDL的通信方式,AIDL的语法与java中的interface语法一致。

跨进程的binder通信即是使用AIDL的通信方式,AIDL的语法与java中的interface语法一致。

Service在声明的时候,如果android:process的value不是":"开头,则系统里有同样名字的进程的话,会放到已存在的同名进程里运行,这样能减小消耗;如果android:process的value是以":"开头,则启动一个以【当前包名:value】为名字的进程的进程。

我这里是用的新启动一个进程,AndroidManifest.xml中的服务声明如下:

<service
            android:name="com.test.multiprocesstest.BackService"
            android:process=":com.newearth.service" >
            <intent-filter>
                <action android:name="com.test.service" />
            </intent-filter>
        </service>

 

在源码目录下,创建一个扩展名为aidl的文件,则在Eclipse中会自动在gen文件夹下生成对应的java文件

其中IserviceProxy.aidl代码如下:

package com.test.multiprocesstest;
 
interface IServiceProxy {
    String test();
}

则在BackService.java 中用内部类实现此接口,并覆写onBind方法即可:

public class BackService extends Service{
       @Override
    public void onCreate() {
       super.onCreate();
       Log.i("SSSS","Service-create-PID:"+android.os.Process.myPid());
       //Log.i("SSSS",Student.name);
       Log.i("SSSS","service 创建");
       }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       // TODO Auto-generated method stub
       Log.i("SSSS","service 启动");
       return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
       // TODO Auto-generated method stub
       return new InnerService();
    }
    @Override
    public void onDestroy() {
       // TODO Auto-generated method stub
       super.onDestroy();
       Log.i("SSSS","service被销毁");
    }
    public void test(){
       Log.i("SSSS","Service-test-PID:"+android.os.Process.myPid());
    }
       private class InnerService extends IServiceProxy.Stub{
 
       @Override
       public String test() throws RemoteException {
           // TODO Auto-generated method stub
           BackService.this.test();
           Log.i("SSSS","innerService--PID:"+android.os.Process.myPid());
           return "inner-service-test";
       }
       
    }
}

在MainActivity中用bind的方式启动service,需要一个ServiceConnection对象

Intent intent=new Intent("com.test.service");
     bindService(intent, new ServiceConnection() {
           
           @Override
           public void onServiceDisconnected(ComponentName name) {
              // TODO Auto-generated method stub    
           }
           
           @Override
           public void onServiceConnected(ComponentName name, IBinder service) {
              // TODO Auto-generated method stub
              IServiceProxy proxy= IServiceProxy.Stub.asInterface(service);
              try {
                  Log.i("SSSS","activity--getServicePID:"+proxy.test());
              } catch (RemoteException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              
           }
       }, Context.BIND_AUTO_CREATE);

这样即可做到两个进程间的通信。

 

标签: AIDL android
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
tnjin
粉丝 27
博文 34
码字总数 25348
×
tnjin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: