上一篇文章学习了用AIDL实现IPC,地址安卓实现IPC(三)—— AIDL,这一篇来学习用广播实现IPC,效果图如下:

实现的效果比较简单,就是点击按钮然后弹出一个Toast,不过这个Toast是在另一个应用实现的哦,下面贴上代码来一探究竟:
整体代码就不贴了,只是贴上点击按钮后的执行的部分代码:
Intent intent1 = new Intent();
intent1.setAction("com.example.computer_ren.otherapplication.BroadCast");
intent1.setPackage("com.example.computer_ren.otherapplication");
intent1.putExtra("data","你好,我是服务器");
sendBroadcast(intent1);
从代码可以看到,启动另一个应用的组件也是用的Intent的隐式启动,不过这个是发送的一个广播,将intent对象传进去,intent内包含我们需要传递的数据,这样就实现了数据的传递,下面看看接收端怎么对数据进行处理的:
public class MyBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null &&
intent.getAction().equals("com.example.computer_ren.otherapplication.BroadCast")) {
Toast.makeText(context, intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
}
}
}
接收端创建了一个广播接收器,根据action来判断发送端发来的广播,根据intent提供的方法getExtra()取出数据。
这里注册广播我是采用的静态注册:
<!--静态注册广播,不随activty的周期,activity销毁依然能接收到广播-->
<receiver android:name=".MyBroadCast">
<intent-filter>
<action android:name="com.example.computer_ren.otherapplication.BroadCast"/>
</intent-filter>
</receiver>
这里需要注意一点,就是发送端隐式启动时的action、接收端判断用的action和注册广播时设置的action,三个地方要一致。
好了,以上就是对安卓实现IPC的第三种方式——Broadcast的学习,过程相对于AIDL还是比较简单,这里涉及到两个知识点,一个就是intent的隐式启动,另一个就是广播的静态注册。除此之外还有广播的一些知识点,比如本地广播和全局广播,有序广播和普通广播等。
对了,因为广播时运行在主线程中,所以不能在其中执行一些耗时操作,如果开启一个子线程去异步执行耗时操作,由于onReceive()的生命周期很短,onReceive()执行完后,广播就结束了,广播实例也就销毁了,如果此时异步操作还未结束,那么就会出错,比如典型的空指针异常啊之类的。所以如果需要在广播接收器中做一些耗时操作,正确的姿势应该是用Intent去启动一个service,在service中去处理耗时操作。
下一篇文章:
网友评论