美文网首页
Content Provider和AIDL、以及各种数据存储传递

Content Provider和AIDL、以及各种数据存储传递

作者: lwwlsky | 来源:发表于2016-06-08 19:35 被阅读222次

    AIDL(每个程序都在自己的虚拟机中运行的,为了保证数据的安全性,进程间不能直接通信,基于Service的ADIL就像一个通信管道使进程间可以通信)
    跨进程如何通讯
    1.两个进程无法直接通信
    2.通过Android系统底层链接进行通信
    基于Service的AIDL
    AIDL基本理论
    AIDL远程调用案例
    AIDL原理简单剖析
    Android Interface Definition Language
    (android 接口定义语言)AIDL使用耗资源 占用内存不要任意使用
    通过IPC机制不同应用程序访问服务才用AIDL
    IPC(进程间通信)
    AIDL 通过IPC让多个应用程序访问你的服务
    并且这个服务要处理多线程才有必要使用AIDL

    Binder 只有IPC 没有多线程 多个应用程序

    Message 只有IPC 没有多线程

    服务端Demo创建

    1)创建aidl文件
    1.java目录右键下 new->folder->AIDL Folder

    2.aidl 右键 aidl 文件 syncgradle
    project视图下面就会生成ImInterface 资源文件
    这样就可以在MainActivity中使用

    两个进程通信要设定好规范:通过什么方法,传入什么参数,返回什么参数
    接口定义 首字母每个开始首字母都要大写
    interface IMyAidl{
    int add(int num1,int num2);//int 返回值 add方法,传入Int类型参数

    }

    2)实现这个接口
    public class IRemoteService extends Service{
    public Ibinder onBind(Intent intent){
    return null;
    }
    //当客户端绑定到这个服务,就会返回iBinder,也就得到下面这个方法 实现Stub静态内部类(学会看API)
    private IBinder iBiner=new IMyAidl.Stub(){
    public int add(int num1,int num2) thrwos RemoteException{
    log.d("Tag","收到了远程请求,输入的参数是"+num1+"和"+num2)
    return num1+num2;
    }
    }

    }
    服务端 三个文件 mainactivity IRemoteSevice实现方法onBind方法 得到Ibinder对象
    .aidl 写上规范


    3)客户端实现接口 必须一致(同意窗口 new 一个modle)

    先新建AIDL 文件夹folder
    再生成.aidl接口文件 IMyAidl 名字必须一致

    oncreate(){...
    initView();
    //软件已启动就绑定
    bindService();
    }

    绑定服务

    //Android 5.0不允许隐士方式启动服务,必须明文标示那个服务
    //显示Intent 绑定服务

    选中内容 control+alt+m 封装成新方法
    private void bindService(){
    Intent intent=new Intent();
    intent.setComponent(new Compentname("com.imy.aidl","com.imy.aidl. IRemoteService"));
    //包名加类名
    bindService(intent,conn,Context.BIND_AUTO_CREATE);
    //三个参数 1.intent 2.service connection 3.flag 表示绑定时自动启动service
    }

    学会使用快捷键 alter+enter(本例中提示conn错误)

    选中conn alt+enter 生成这个connection
    mainActivity中:
    IMyAidl adil;
    private ServiceConnection conn=new ServiceConnection(){
    //绑定上服务时
    public void onServiceConnected(ComponentName name,IBindle service){
    //拿到了远程的资源,实质上就是服务端的binder通过该方法获得
    aidl=IMyAidl.Stub.asInterface(service);
    }
    public void onServiceDisConnected(ComponentName name,IBindle service){
    //回收资源不至于泄露内存
    aidl=null;
    }
    }}

    onClick(){
    try{
    //调用远程的服务
    int res=aidl.add(num1,num2);//服务端获取的那个
    mEdit.setTex(res+"");
    }catch{
    }
    }//改成

    //APP销毁的时候也要解绑定 必须的避免OOM
    void Destroy(){
    super.onDestory();
    unbindService(conn);
    }
    也是三个文件

    相关文章

      网友评论

          本文标题:Content Provider和AIDL、以及各种数据存储传递

          本文链接:https://www.haomeiwen.com/subject/aitldttx.html