博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android92 aidl远程进程通信
阅读量:6621 次
发布时间:2019-06-25

本文共 4279 字,大约阅读时间需要 14 分钟。

 

 05项目RemoteService.java

package com.itheima.remoteservice;//05项目import com.itheima.remoteservice.PublicBusiness.Stub;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;public class RemoteService extends Service {    @Override    public IBinder onBind(Intent intent) {        System.out.println("bind方法");        return new furong();    }    //之前是:class furong extends Binder implements PublicBusiness{
class furong extends Stub{
//直接继承Stub,因为Stub是extends android.os.Binder implements com.itheima.remoteservice.PublicBusiness @Override public void qianXian() { banzheng(); } } public void banzheng(){ System.out.println("李局帮你来办证"); }}

05项目PublicBusiness.aidl

package com.itheima.remoteservice;interface PublicBusiness {    void qianXian();}

05项目清单文件配置service

06项目PublicBusiness.aidl

package com.itheima.remoteservice;interface PublicBusiness {    void qianXian();}

06项目MainActivity.java

package com.itheima.runremote;//06项目import com.itheima.remoteservice.PublicBusiness;import com.itheima.remoteservice.PublicBusiness.Stub;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.view.Menu;import android.view.View;public class MainActivity extends Activity {    private MyserviceConn conn;    PublicBusiness pb;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        conn = new MyserviceConn();    }    public void click(View v){        //启动远程服务        Intent intent = new Intent();        intent.setAction("com.itheima.remote");        startService(intent);    }    public void click2(View v){        //停止远程服务        Intent intent = new Intent();        intent.setAction("com.itheima.remote");        stopService(intent);    }        public void click3(View v){        Intent intent = new Intent();        intent.setAction("com.itheima.remote");        bindService(intent, conn, BIND_AUTO_CREATE);    }    public void click4(View v){        unbindService(conn);    }    class MyserviceConn implements ServiceConnection{        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            //把Ibinder中间人对象强转成publicbusiness            //返回的service是一个furong对象继承 Stub,但是该service对象是05项目的,是传不过来的,            pb = Stub.asInterface(service);        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    }        public void click5(View v){        try {            pb.qianXian();        } catch (RemoteException e) {            e.printStackTrace();        }    }}
###服务的分类* 本地服务:指的是服务和启动服务的activity在同一个进程中* 远程服务:指的是服务和启动服务的activity不在同一个进程中(在不同的工程中),隐士启动服务。###AIDL是Android interface definition language安卓接口定义语言,用于进程间通信技术,默认2个进程是不能通信的,安卓里面不同的应用有自己各自的内存空间,内存之间是不能访问的,linux中通过管道进行进程通信,安卓中也有管道概念,handeler就是管道。06项目想访问05项目的对象的方法就要用进程通信,相当于通过进程通信可以把05项目内存的对象传到06项目的内存进行使用。1. 把05项目的远程服务的方法抽取成一个单独的接口java文件2. 把05接口上面的java文件PublicBusiness.java的后缀名改成aidl,在05项目gen中会自动生成PublicBusiness.java3. 在05项目中自动生成的PublicBusiness.java文件中,有一个静态抽象类Stub,它已经继承了binder类,实现了publicBusiness接口,这个类就是新的中间人4. 把aidl文件复制粘贴到06项目,粘贴的时候注意,aidl文件所在的包名必须跟05项目中aidl所在的包名一致5. 在06项目中,强转中间人对象时,直接使用Stub.asInterface()

 

广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册。远程服务只能隐式启动,类似隐式启动Activity,在清单文件中配置Service标签时,必须配置intent-filter子节点,并指定action子节点。应用场景:远程服务中的中间人对象,其他应用是拿不到的,那么在通过绑定服务获取中间人对象时,就无法强制转换,使用aidl,就可以在其他应用中拿到中间人类所实现的接口

 

##支付宝远程服务(可以通过jar包导入到被绑定的应用中去,但是支付宝不用这种方式,因为这样的话所有支付的密码操作都在被绑定的应用里面执行,那么有可能这个被绑定的应用是恶意应用将会盗取密码,所以阿里巴巴不可能让支付进程跑在第三方应用进程中,所以是远程访问调用支付宝的方法,所有输入密码都是在支付宝的进程去做的,所以支付宝是没有jar包的,而是重新下载支付宝软件在支付宝软件去支付的,苹果不用支付宝是通过苹果的软件去支付的。)1. 定义支付宝的服务,在服务中定义pay方法2. 定义中间人对象,把pay方法抽取成接口3. 把抽取出来的接口后缀名改成aidl4. 中间人对象直接继承Stub对象5. 注册这个支付宝服务,定义它的intent-Filter##需要支付的应用1. 把刚才定义好的aidl文件拷贝过来,注意aidl文件所在的包名必须跟原包名一致2. 远程绑定支付宝的服务,通过onServiceConnected方法我们可以拿到中间人对象3. 把中间人对象通过Stub.asInterface方法强转成定义了pay方法的接口4. 调用中间人的pay方法

 

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4957248.html,如需转载请自行联系原作者

你可能感兴趣的文章
Animation总结(差值器和估值器)
查看>>
Java数据结构与算法(十)-图
查看>>
4.1 在SELinux中客体类存在的目的
查看>>
如何用iPad运行Python代码?
查看>>
PHP学习3——数组
查看>>
E-HPC支持多队列管理和自动伸缩
查看>>
Maven的插件:命令行执行
查看>>
各种设备的CSS3MediaQuery整理及爽歪歪写法
查看>>
CVE-2017-8464远程命令执行漏洞(震网漏洞)复现
查看>>
Java 12 将于3月19日发布,8 个最终 JEP 一览
查看>>
基础为重,Python的基础,成就月薪过万
查看>>
索罗斯的反身理论和汇率分析
查看>>
Linux登录那点事
查看>>
angular项目中bootstrap-datetimepicker时间插件的使用
查看>>
通过网络仓库建立本地的yum仓库
查看>>
【web端权限维持】利用ADS隐藏webshell
查看>>
Linux下gdb的安装及使用入门
查看>>
Java 程序执行过程的内存分析
查看>>
灾难恢复-boot分区的恢复方法
查看>>
小游戏-猜数字
查看>>