AIDL应用与应用间的通信(下)

第一步客户端获取接口

客户端如何获取AIDL接口呢?通过IMyService.Stub.asInterface(service)来得到IMyService对象:
private IMyService mRemoteService; 
private ServiceConnection mRemoteConnection = new ServiceConnection() {    
        public void onServiceConnected(ComponentName className, IBinder service) {    
                mRemoteService = IMyService.Stub.asInterface(service);    
        }    
        public void onServiceDisconnected(ComponentName className) {    
                mRemoteService = null;    
        }    
};

在生成的IMyService.java里面会找到这样的代码:

/** 
* Cast an IBinder object into an com.demo.IMyService interface, 
* generating a proxy if needed. 
*/ 
public static com.demo.IMyService asInterface(android.os.IBinder obj) {...}

而service的绑定没有什么不同:

if (mIsRemoteBound) { 
        unbindService(mRemoteConnection); 
}else{ 
        bindService(new Intent("com.demo.IMyService"), 
                               mRemoteConnection, Context.BIND_AUTO_CREATE); 
} 
mIsRemoteBound = !mIsRemoteBound;

第二步通过IPC调用/传递数据

客户端绑定service后就能通过IPC来调用/传递数据了,直接调用service对象的接口方法:

addPersonButton.setOnClickListener( 
                new View.OnClickListener(){ 
                        private int index = 0; 
                        @Override 
                        public void onClick(View view) { 
                                Person person = new Person(); 
                                index = index + 1; 
                                person.setName("Person" + index); 
                                person.setAge(20); 
                                person.setTelNumber("123456"); 
                                try { 
                                        mRemoteService.savePersonInfo(person); 
                                } catch (RemoteException e) { 
                                        e.printStackTrace(); 
                                } 
                        } 
                }); 
listPersonButton.setOnClickListener( 
                new View.OnClickListener(){ 
                        @Override 
                        public void onClick(View view) { 
                                List<Person> list = null; 
                                try { 
                                        list = mRemoteService.getAllPerson(); 
                                } catch (RemoteException e) { 
                                        e.printStackTrace(); 
                                } 
                                if (list != null){ 
                                        StringBuilder text = new StringBuilder(); 
                                        for(Person person : list){ 
                                                text.append("\nPerson name:"); 
                                                text.append(person.getName()); 
                                                text.append("\n             age :"); 
                                                text.append(person.getAge()); 
                                                text.append("\n tel number:"); 
                                                text.append(person.getTelNumber()); 
                                        } 
                                        inputPersonEdit.setText(text); 
                                }else { 
                                        Toast.makeText(ServiceActivity.this, "get data error", 
                                                        Toast.LENGTH_SHORT).show(); 
                                } 
                        } 
                });

其他关于权限的一些问题:
Permission 权限:

如果Service在AndroidManifest.xml中声明了全局的强制的访问权限,其他引用必须声明权限才能来start,stop或bind这个service.
另外,service可以通过权限来保护她的IPC方法调用,通过调用checkCallingPermission(String)方法来确保可以执行这个操作。

AndroidMainfest.xml的Service元素:

<service android:name=".RemoteService" android:process=":remote"> 
</service>

这里的android:process=”:remote”,如果没有添加,在同一个程序里使用IPC,即同一个程序作为客户端/服务器端,结果运行mRemoteService = IMyService.Stub.asInterface(service);时提示空指针异常。

android:process=”:remote”,代表在应用程序里,当需要该service时,会自动创建新的进程。

android:process=”remote”,没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值