Android IPC机制(一) 开启多线程

一 Android IPC简介

IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,指两个进程之间进行数据交换的过程.

1.1 为什么要开启多进程

  • 单进程分配的内存不足,早期android系统只为一个单进程的应用分配16M的可用进程;
  • 独立运行的组件,它的服务会另开一个进程;
  • 运行一些"不可见人"的操作,比如获取用户隐私数据,比如双守护进程防止被用户杀掉

1.2 开启多进程

开启多进程的方法:给四大组件(Activity,Service,Receiver,ContentProvider)在AndroidMenifest中指定android:process属性.

a)在一个Activity中启动一个Service

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent mServiceIntent = new Intent(this,MyService.class);
        startService(mServiceIntent);

    }
}

b)MyService代码

public class MyService extends Service {
    private static final String TAG = "aliang";

    @Override
    public void onCreate() {
        Log.e(TAG,"MyService is onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG,"MyService is onStartCommand");
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        Log.e(TAG,"MyService is onDestroy");
    }

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

c)在AndroidManifest.xml中的配置 android:process

<service
            android:name=".MyService"
            android:label="@string/app_name"
            android:process=":remote" />

d)冒号":"代替当前应用的包名,所以MyService跑在进程名为"com.boxing.jnidemo:remote"的进程中,我们也可以设置为android:process="com.boxing.jnidemo.remote",这两个命名的区别在于:

冒号开头的,这个新的进程对于应用来说是私有的,要在当前的进程名前面附加上当前的包名,其他应用的组件不可以和它泡在同一个进程中;

包名.remote,他是一种完整的命名方式,属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中.

1.3 多进程引出的问题

一般来说,使用多进程会造成以下几个方面的问题:

  • 静态成员和单例模式完全失效;
  • 线程同步机制完全失效;
  • SharedPreferences的可靠性能下降;
  • Application会多次创建

虽然多进程带来了一系列问题,但是我们不能因为多进程有很多问题就不正视它,为了解决这个问题,系统提供了很多跨进程通信方法,比如通过Intent来传递数据,共享文件SharedPreferences,基于Binder的Messenger,AIDL以及Socket.

二 IPC基础概念介绍

2.1 Serializable接口

它是一个序列化接口,是一个空接口,为对象提供标准的序列化和反序列化操作.

注意:

①静态成员变量属于类不属于对象,所以不会参与序列化过程;

②用transient关键字标记的成员变量不参与序列化过程;

③系统默认序列化过程也是可以改变的.     

2.2 Parceable接口

Parcel内部包装了可序列化的数据,可以在Binder中自由传输,序列化功能由writeToParcel方法来完成,反序列化功能由CREATOR来完成,内容描述功能由describeContents方法来完成,几乎所有情况下这个方法都应该返回0.

2.3 Binder

直观来说:Binder是Android中的一个类,实现了IBinder接口,是Android中的一种跨进程通信方式;

从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager等等)和相应ManagerService的桥梁;

从Android应用层来讲:Binder是客户端和服务端进行通信的媒介.

 

 

未完待续...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值