Android进程间通讯(1)–Bundle和文件共享
前言:之前记录过android的IPC方式有Bundle,文件共享,Messenger,AIDL,ContentProvider和socket。后面将详解这几种IPC方式。按类别原理分类,实际上方式可以分为4种:1.Bundle 2.文件共享 3.Binder,包括Messenger,AIDL, ContentProvider 4.socket。接下来讲解Bundle和文件共享的使用
android四大组件中的三大组件(Activity, Service, Receiver)都支持在Intent传递Bundle数据,由于Bundle实现了Parcelable接口,所以可以十分方便的在进程间传输,当然我们传输的数据必须能够被序列化,比如基本类型、实现了Parcelable接口的对象、实现了Serializable接口的对象以及一些Android所支持的特殊对象。
在同一个android应用中创建多进程,需要修改AndroidManifest.xml中process属性,即在四大组件的根节点添加android:process=”hdc.video”,即可创建一个新的名为hdc.video的进程
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:process="hdc.video">
而应用的默认进程是应用的包名,也可以在application根节点修改process属性进行更改
android:name="com.hdc.voicesAssistant"
android:allowBackup="true"
android:icon="@mipmap/dan_icon"
android:label="@string/app_name"
android:roundIcon="@mipmap/dan_icon"
android:supportsRtl="true"
android:process="com.hdc.voiceAssistant"
android:theme="@style/AppTheme">
假如android:process=”com.hdc.voiceAssistant” 进程的MainActivity需要传递数据到android:process=”hdc.video”的进程的WebVideoActivity,则在MainActivity中
Intent intent = new Intent();
intent.setClass(MainActivity.this, WebVideoActivity.class);
Bundle bundle = new Bundle();
bundle.putString("second", "second");
intent.putExtras(bundle);
startActivity(intent);
在WebVideoActivity的onCreate方法中接受数据
Bundle bundle = getIntent().getExtras();
bundle.getString("second");
Android是基于Linux内核,使得其并发读写文件可以没有限制地进行,甚至两个线程对同一个文件进行写操作都是允许的。通过文件交换数据使得进程间的通讯很好进行,但是其弊端就是可能存在数据异常,延迟等问题。通过文件共享的方式共享数据对文件的格式是没有要求的,可以是文本文件也可以是XML文件,只要读写双方约定好数据格式即可。
Android中常用的方式是SharedPreference,起底层使用的是xml。存数据如下:
context.getSharedPreferences("user_preferences",Activity.MODE_PRIVATE)
SharedPreferences.Editor editor = mUserPreferences.edit();
editor.putString("user_id", user_id);
editor.apply();
其他进程或当前进程其他地方使用时只需要获取起数据即可:
context.getSharedPreferences("user_preferences",Activity.MODE_PRIVATE)
String user_id = preference.getString("user_id","");
总结:
上面两种方式是比较常用的进程间通讯方式,也是比较简单的IPC方式。