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,但是多进程的时候高并发读写可能出现数据丢失,不建议使用
- android-IPC进程间通信
- android IPC进程间通信
- Android IPC 进程间通信
- Android IPC 进程间通信
- Android IPC 进程间通信
- Android进程间通信IPC
- android进程间通信(IPC)之AIDL
- Android进程间通信IPC机制Binder
- Android的IPC(进程间通信)机制
- Android IPC 进程间通信实现理解
- Android AIDL进程间通信(IPC)
- IPC——android进程间通信
- Android AIDL IPC实现进程间通信
- Android进程间通信(IPC)常用方式
- Android进程间通信(IPC)之Messenger
- Android进程间通信(IPC)之AIDL
- Android进程间通信(IPC)之Socket
- Android 进程间通信,基于Messeger(IPC)
- PL/SQL如何调试Oracle存储过程
- Codeforces Round #353 (Div. 2) E 线段树+dp
- <JAVA学习笔记二>——设计模式之装饰者设计模式
- 利用tomcat服务器配置https双向认证、https单向认证-ssl、tls
- 【一天一道LeetCode】#58. Length of Last Word
- android IPC进程间通信
- LeetCode 345:Reverse Vowels of a String
- java ArrayList Vector LinkedList的区别
- 二维树状数组
- struts2运行出现The requested is not available(404)错误,解决方案
- iOS - NSDate与NSString的相互转换
- 浏览器的兼容问题及解决方案
- curl常用命令
- 圆圈中最后剩下的数字