android

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在进程间传值比较简单,我们就不再过多说明。

上一篇 下一篇

猜你喜欢

热点阅读