IPC Bundle的方式实现进程间通信
2020-05-02 本文已影响0人
静享时光
IPC传值的方式有多种:
1、通过Bundle
2、使用文件共享
3、使用Messenger
4、使用AIDL
5、使用ContentProvider
6、使用Socket
通过Bundle传值
在Android中,Activity,Service,Receiver都支持在Intent中通过Bundle传递数据。由于
由于Bundle实现了Parcelable接口,所以可以在不同进程间传输。需要注意的是传递的数据必须能够被序列化。
通过Bundle传值的示例
Student.java
public class Student implements Serializable {
private static final long serialVersionUID = 8637926380668716421L;
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "name: " + name + " age: " + age;
}
}
注册
<activity android:name=".ipc_demo2.FirstActivity" />
<activity
android:name=".ipc_demo2.SecondActivity"
android:process=":remote" />
SecondActivity注册时通过process开启了一个新进程。
FirstActivity.java
public class FirstActivity extends Activity implements View.OnClickListener {
private String data = "";
private Student student;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_activity_layout);
initView();
}
private void initView() {
findViewById(R.id.deal_data).setOnClickListener(this);
findViewById(R.id.jump_second).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.deal_data:
dealData();
break;
case R.id.jump_second:
jumpToSecond();
break;
default:
break;
}
}
private void dealData() {
new Thread(new Runnable() {
@Override
public void run() {
try {
//给一个延迟的效果,以模拟大量的逻辑处理
Thread.sleep(1000);
student = new Student("xiaoYang", 20);
data = "xiaohong";
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
private void jumpToSecond() {
Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("data", data);
bundle.putSerializable("student", student);
intent.putExtra("BundleData", bundle);
startActivity(intent);
}
}
SecondActivity.java
public class SecondActivity extends Activity {
private TextView showDataTv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity_layout);
initView();
getIntentData();
}
private void initView() {
showDataTv = (TextView) findViewById(R.id.show_data);
}
private void getIntentData() {
Intent intent = getIntent();
if (intent == null) {
return;
}
Bundle bundleData = intent.getBundleExtra("BundleData");
if (bundleData == null) {
return;
}
String data = bundleData.getString("data");
Student student = (Student) bundleData.getSerializable("student");
String dataStr = data + " " + student;
Log.e("Bundle传值", dataStr);
showDataTv.setText(dataStr);
}
}
使用Bundle在进程间传值比较简单,我们就不再过多说明。