IPC

1:操作系统  就是管理硬件和软件资源的程序  是一个程序在启动机器的时候 操作系统这个程序就会被启动

                    它是机器和用户之间交互的一个接口  其实用户就是操作系统这个程序来控制整个计算机

                    比如 xp andoird win7系统  都是可视化界面  便于用户简易的控制计算机。

2:驱动  是设备驱动程序       它也是程序  是硬件的接口  操作系统就是通过这个接口实现控制硬件的

             所以我们在安装完操作系统的时候  有的时候就需要安装相关硬件的设备驱动

            实现电子信号和高级程序语言之间的转换。就是一个桥梁

            eg:设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。                            操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马                              上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。


2:跨进程通信

android:precess属性设置是否开启一个新的进程

多进程导致1:静态成员变量单例模式失效  2:线程同步机制失效 3:sharepreference可靠性下降 4:Application会被多次创建


ContentProvider支持跨进程访问,

网络访问也可以支持跨进程数据传递  Socket也可以实现ipc


实现进程间通信的方式

1:使用bundle实现数据传递

2:使用文件实现数据传递

3:使用Messenger实现ipc

     

public Messenger(Handler target) {
    mTarget = target.getIMessenger();
}

public Messenger(IBinder target) {
    mTarget = IMessenger.Stub.asInterface(target);
}

底部已经实现了aidl

所以可以借助他实现进程间通信,ipc

public IBinder getBinder() {
    return mTarget.asBinder();
}
public void send(Message message) throws RemoteException {
    mTarget.send(message);
}

以上api实现跨进程通信。


bindService实现

eg:

private Messenger messenger;

private ServiceConnection serviceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG, "onServiceConnected: ");
        messenger=new Messenger(service);
        Message msg=Message.obtain(null,0);
        Bundle bundle=new Bundle();
        bundle.putString("msg","hello ,this is client");
        msg.setData(bundle);
        try {
            messenger.send(msg);
        }catch (RemoteException e){
            Log.d(TAG, "onServiceConnected: "+e.toString());
        }
    }
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
};


service中通过messenger的底层binder建立关联:

class MyHandler extends Handler{
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
            case  0:
                Log.d(TAG, "handleMessage: 000000000");
                break;

            case 1:
                Log.d(TAG, "handleMessage: 1111111111");
                break;
            default:
                super.handleMessage(msg);
        }
    }
}
private Messenger messenger=new Messenger(new MyHandler());

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return messenger.getBinder();
}





4:aidl





3:Binder是android系统提供的ipc机制,还有管道 socket

Binder是一个虚拟设备,android中有一个全局ServiceManager端,它的作用是管理系统中各种服务。


android系统中,Client Server ServeManager之间的交互如下:

1:Client Server ServerManager在用户空间实现,Binder驱动程序在内核空间实现

2:Server的进程先注册到一些Service到ServiceManager里面  所以Server是ServiceManager的客户端,而ServiceManager就是服务端,是一个守护进程。能够管理Server并向Client提供Server接口



aidl使用简单步骤:

1:服务端创建  另外创建一个aidl文件夹  (因为客户端也需要一份aidl文件 并且包名都必须要保持一致  )


代码:IbookManager

package com.aidl.test;
import com.aidl.test.Book;
interface IBookManager{
List<Book> getBookList();
void addBook(in Book book);
}
注意我们在使用自定义class的时候  这个class需要实现parcelable接口,

public class Book implements Parcelable {

    String name;
    String author;

    public Book(String name, String author) {
        this.name = name;
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(author);
    }

    public static final Creator<Book> CREATOR=new Creator<Book>(){
        @Override
        public Book createFromParcel(Parcel source) {
            return new Book(source);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };

    private Book(Parcel in){
        name=in.readString();
        author=in.readString();
    }
}

注意还需要创建Book.aidl

package com.aidl.test;

parcelable Book;

编译会在build看到我们aidl



创建IRemoteService服务端:

public class IRemoteService extends Service {

   private ArrayList<Book>list=new ArrayList<>();

   private Binder mBinder =new IBookManager.Stub(){

       @Override
       public List<Book> getBookList() throws RemoteException {
           return list;
       }

       @Override
       public void addBook(Book book) throws RemoteException {
           list.add(book);
       }
   } ;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        list.add(new Book("yingyu","teacher1"));
        list.add(new Book("shuxue","teacher2"));
    }

}

在manifest注册该service

2:创建客户端代码:

      需要将服务器端aidl文件copy一份到客户端代码里面  注意保证aidl文件的包名类         名完全一致

3:客户端调用

  

private IBookManager iBookManager;


private ServiceConnection mCoonection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        iBookManager=IBookManager.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
       iBookManager=null;
    }
};

客户端与服务器端创建连接:

Intent intent=new Intent();
intent.setAction("com.aidl.test.IBookManager");
intent.setComponent(new ComponentName("com.aidl.test","com.aidl.test.IRemoteService"));
bindService(intent,mCoonection, Context.BIND_AUTO_CREATE);


if(iBookManager!=null){
    try {
       ArrayList<Book> list= (ArrayList<Book>) iBookManager.getBookList();
       for(int i=0;i<list.size();i++){
           Log.d(TAG, "onClick: getAuthor=="+list.get(i).getAuthor()+"--getName=="+list.get(i).getName());
       }
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}



1 . 如果android:process的值以冒号开头的话,那么该进程就是私有进程,如下:

配置:

<application
   ……
   <service android:name=".ProcessTestService" android:process=":secondProcess"/>
   ……
</application>
  • 1
  • 2
  • 3
  • 4
  • 5

进程:

这里写图片描述

2 . 以小写字母开头(如com.secondProcess),那么就是公有进程,android:process值一定要有个点号:

不能以数字开头,并且要符合命名规范,必须要有.否则将会出现这种错误: Invalid process name simon in package com.wind.check: must have at least one ‘.’ 
配置:

<application
   ……
   <service android:name=".LocalService" android:process="com.secondProcess"/>
   ……
</application>

3 . 私有进程和公有进程的区别: 
android:process=":remote",以冒号开头,冒号后面的字符串原则上是可以随意指定的。如果我们的包名为“com.biyou.multiprocess”,则实际的进程名 
为“com.biyou.multiprocess:remote”。这种设置形式表示该进程为当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。 
全局进程 
进程名称不以“:”开头的进程都可以叫全局进程,如android:process="com.secondProcess",以小写字母开头,表示运行在一个以这个名字命名的全局进程中,其他应用通过设置相同的ShareUID可以和它跑在同一个进程




































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值