1.广播机制的描述
Android的广播机制可以分为两部分:广播接收者,广播发送者,这和Qt的信号与槽机制相类似,都有信号的发送者和信号的接收者。信号和槽机制可用于Qt各个模块之间的通讯,可以传递信号以及数据。广播机制就是Andoid组件之间的通讯方式。有以下几种使用环境:
(1)同一app内部的同一组件内的消息通信(单个或多个线程之间);
(2)同一app内部的不同组件之间的消息通信(单个进程);
(3)同一app具有多个进程的不同组件之间的消息通信;
(4)不同app之间的组件之间消息通信;
(5)Android系统在特定情况下与App之间的消息通信。
Android中的广播主要分为两种类型:标准广播,有序广播
(1)标准广播是一种完全异步执行的广播,在广播发出后,所有的广播接收器都会在同一时刻接收这一条消息。这种广播效率高但同时也意味着它无法被截断。标准广播工作流如下图所示:
(2)有序广播是一种同步执行的广播,在广播发出后,在同一时刻只有一个广播接收器可以接收这条广播信号。只有前一个广播接收器完成自己所有的逻辑之后,广播才会继续传递。所以此时的广播接收器是有优先级区分的。有序广播的工作流程如下:
2.发送自定义广播
(1)首先要定义一个广播接收器来接收广播
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("com.example.brocast.MYBOARDCAST"))
{
Toast.makeText(context,"test",Toast.LENGTH_SHORT).show();
test test1 = (test) intent.getSerializableExtra("rolldata");
String test = test1.k;
Log.d("Mainactiv",test+"success");
}
else
{
Log.d("Mainactiv","error");
}
}
这里收广播信号并解析广播信号中传递的数据。
(2)需要在AndroidMainifest.xml文件中对这个广播接收器进行更改
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.brocast.MYBOARDCAST"/>
</intent-filter>
</receiver>
这里可以看出让MyReceiver接收到一条值为“com.example.brocast.MYBOARDCAST”的广播,等会在发送广播时要发出这样一条广播
(3)发出广播
在这里创建了一个Button,通过Button的onClick来触发发送广播
首先注册广播接收器,创建IntentFiler的实例,然后添加上一步定义的广播值。
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.brocast.MYBOARDCAST");
myReceiver = new MyReceiver();
registerReceiver(myReceiver,intentFilter);
然后通过onClick触发
public void onClick(View view)
{
test l = new test();
l.i = 1;
l.k = "kk";
l.y = 11;
Log.d("Mainactiv", l.k);
Intent intent = new Intent("com.example.brocast.MYBOARDCAST");
intent.putExtra("rolldata", l);
Toast.makeText(MainActivity.this,"ssssssss",Toast.LENGTH_SHORT).show();
//
sendBroadcast(intent);
}
动态注册的广播需要在使用结束之后注销、
@Override
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(myReceiver);
}
到这一个完整的广播机制完成,可以实现实现信号的传递以及数据的流动。