android IPC进程间通信

来源:互联网 发布:c语言中void的例题 编辑:程序博客网 时间:2024/05/22 05:25

        最近经常有人问我什么是进程,什么是线程,进程间如何通信,原理是什么?今天有时间我就简单讲讲我的理解,如果有不对的地方求指教:(我是新手我怕谁 )

        首先我们说说概念,线程是cpu中最小的单位,每一个线程可以是一个请求,一个处理事件。而进程在android中可以是一个应用,而一个应用中可以有多个进程,在进程中可以有多个线程,或者一个线程(主线程),比如说我们的进程来代表打开电脑这个动作,而线程可以是我们按下电脑开机键+我们手指离开开机键这个操作,其实很好解释。

      那么为什么要用多线程呢?就android来言,android主进程中不允许做耗时的操作,如果执行了很可能就anr,而且非常影响体验,针对线程这一节,以后会单独写一篇这里不做解释了

      那么为什么需要多进程呢?这个问题一般是由于特殊的原因放到独立的进程中,防止占用内存太多,影响app的体验,因为android在很早的版本 给apk发配内存只有16m,而现在的手机虽然分配的已经很大,但是有干不过产品的要求啊,所以在这样的情况下,单独给app分配一个内存空间是有必要的

      那么android中如何判断是多进程呢?可以通过adb 查看进程中是不是多了一个在androidmenifest 中指定四大主键 process:"abc" abc的进程,而android会默认给每一个进程一个UUid 

     多进程优势有很多,但是他的炕也是很多的,第一数据同步:第二静态变量修改只能修改当前进程中的数据,第三线程同步无法实现,第四:applaction会创建多次

    针对不同的问题我们做不同处理:

    如果要做进程通信,还需要对对象序列号了解:一般有两种方式:1.实现serializable接口 这个是java提供的

   2.android提供了parceable方式,用起来效率比较高,但是代码实现相对麻烦

      

实现Parcelable就是为了进行序列化,那么,为什么要序列化?
      1)永久性保存对象,保存对象的字节序列到本地文件中;
      2)通过序列化对象在网络中传递对象;
      3)通过序列化在进程间传递对象。

  代码如下:

  

import android.os.Parcel;import android.os.Parcelable;/** * Created by fengxb on 2016/5/24. */public class UserBean implements Parcelable {    private String uName;    public int getuAge() {        return uAge;    }    public void setuAge(int uAge) {        this.uAge = uAge;    }    public String getuName() {        return uName;    }    public void setuName(String uName) {        this.uName = uName;    }    private int uAge;    public UserBean(){            }        protected UserBean(Parcel in) {        String s = in.readString();        int i = in.readInt();    }    public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {        @Override        public UserBean createFromParcel(Parcel in) {            return new UserBean(in);        }        @Override        public UserBean[] newArray(int size) {            return new UserBean[size];        }    };    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel parcel, int i) {        parcel.writeString(uName);        parcel.writeInt(uAge);    }}
而传值的时候
Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);    Bundle mBundle = new Bundle();
<pre name="code" class="html" style="font-size: 18px; font-weight: bold;"><span style="font-family: Arial, Helvetica, sans-serif;">UserBean </span><span style="font-family: Arial, Helvetica, sans-serif;">mPerson=</span><span style="font-family: Arial, Helvetica, sans-serif;"> new </span><span style="font-family: Arial, Helvetica, sans-serif;">UserBean():</span>
mBundle.putParcelable(KEY,mPerson);
mIntent.putExtras(mBundle); startActivity(mIntent);


在两一个acitivty中读取:

<span style="font-family: FangSong_GB2312;font-size:18px; background-color: rgb(255, 255, 255);">UserBean</span><pre name="code" class="html" style="display: inline !important;">  mPerson
= (UserBean)getIntent().getParcelableExtra(ParcelableTest.KEY);    

看代码也是很简单的

 Binder理解不容,大家可以去查看相关文章

  这里主要讲解如何跨进程传值,android通常使用Intent 和Binder方式进行进程通信,ContentProvider本身就支持跨进程共享数据,还有一种方式是通过网络socket通信。还有一种也是可以读取文件 sharedpreferences,但是多进程的时候高并发读写可能出现数据丢失,不建议使用



      

0 0
原创粉丝点击