android IPC进程间通信

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

        首先我们说说概念,线程是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,但是多进程的时候高并发读写可能出现数据丢失,不建议使用



      

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值