Android:进程间通信交互

Intent 的 ComponentName

Intent作为我们最常用的数据传输渠道,特别是通过Intent打开一个Activity,想必每个人都不会陌生。通常我们用到的都是通过Intent打开同一个进程(App)内部的Activity,如果想实现跨进程通讯,就需要把Intent对象发送到另一个(App)中,并解析出来,这时就需要ComponentName来为我们做这件事情了。既然可以发送数据到另外的进程,也就可以实现不同进程间的交互了。 注意事项:如果A要打开另一个进程中的B中的Activity,那么要在B项目中的AndroidManifest文件中,把要打开的Activity的exported设置为true ,否则将会报错。

android:exported=”true”

我们将要用到ComponentName的构造函数如下:

public ComponentName(String pkg, String cls) {if (pkg == null) throw new NullPointerException(“package name is null”);if (cls == null) throw new NullPointerException(“class name is null”);mPackage = pkg;mClass = cls;}

它需要两个参数,第一个参数是一个存在的pakage(包),第二个是这个包中你要打开的类的名字(注意是带完整包名的),下面是使用例子: 进程AndroidAIDL(com.example.androidaidl)中的MainActivity

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//接收传过来的Intentif (getIntent() != null){System.out.println(“———-“+getIntent().getIntExtra(“id”, 0)+”———-“);}}

另一个进程AndroidTest,在这里的MainActivity中我们写如下代码:

/**指定包名和带包名的Activity的名字*/ComponentName componentName = new ComponentName(“com.example.androidaidl”, “com.example.androidaidl.MainActivity”);Intent intent = new Intent();intent.putExtra(“id”, 1001);intent.setComponent(componentName);startActivity(intent);

运行上面代码后,会看到LogCat中打印出 1001,表示接收AndroidTest进程传来的Intent正常。

注意事项:上面代码中我们传递的是基本的数据类型,对于基本数据类型,比如Int,String等接收时可以像上面那样直接读取,但是如果发送的是复杂的对象,该对象需要实现Serializable或者Parcelable接口。 比如我们定义一个 SendData 对象作为传递对象,它实现 Parcelable 接口:

public class SendData implements Parcelable{int id;String content;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public static final Parcelable.Creator<SendData> CREATOR = new Parcelable.Creator<SendData>() {@Overridepublic SendData createFromParcel(Parcel source) {// TODO Auto-generated method stubSendData data = new SendData();data.setId(source.readInt());data.setContent(source.readString());return data;}@Overridepublic SendData[] newArray(int size) {// TODO Auto-generated method stubreturn new SendData[size];}};@Overridepublic int describeContents() {// TODO Auto-generated method stubreturn 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {// TODO Auto-generated method stubdest.writeInt(id);dest.writeString(content);}}

发送代码:

Intent intent = new Intent();SendData data = new SendData();data.setId(1001);data.setContent(“hellow world”);//发送序列化对象intent.putExtra(“data”, data);startActivity(intent);

接收代码

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (getIntent() != null){if (getIntent().getParcelableExtra(“data”) == null)return;//读取序列化对象,并转化为SendData类型SendData data = (SendData)getIntent().getParcelableExtra(“data”);System.out.println(“———-“+data.getContent()+”———–“);}}

如果在同一个进程的话,上面的方法没有任何问题,如果在不同进程中,就要注意,SendData 这个bean所在的包名,在各个项目中必须一样,否则接收方,无法解析

广播-BroadcastReceiver

Android的广播是系统级的,只要传递的Action一样(下面的例子中,都使用 Action_Test),就可以接收到其他进程广播的消息,广播中可以通过Intent传递数据。

只有一条路不能选择——那就是放弃的路;

Android:进程间通信交互

相关文章:

你感兴趣的文章:

标签云: