一、前言
跨APP广播消息,顾名思义就是要在两个APP中传递消息。本文主要介绍动态注册广播消息,需要实现静态跨APP广播消息的请查看我的这篇文章跨APP静态广播。效果如图所示
二、实现
1、动态注册和发送广播
新建一个工程,在默认的活动中动态注册和发送广播
public class MainActivity extends AppCompatActivity {
private DynamicReceiver dynamicReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化IntentFilter对象
IntentFilter filter = new IntentFilter();
filter.addAction("BroadcastTest");
filter.setPriority(100);
dynamicReceiver = new DynamicReceiver();
//注册广播接收
registerReceiver(dynamicReceiver,filter);
Button button=findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("BroadcastTest");
intent.putExtra("Info","动态广播信息");
sendOrderedBroadcast(intent,null);
// Intent intent = new Intent("com.example.boradcasttestapplication.MyBroadcastReceiver");
// intent.setComponent(new ComponentName("com.example.boradcasttestapplication", "com.example.boradcasttestapplication.MyBroadcastReceiver"));
// sendOrderedBroadcast(intent,null);
//
// Intent intent2=new Intent("com.example.mybroadcastreceiverapplication2.AnotherBroadcastReceiver");
// intent2.setComponent(new ComponentName("com.example.mybroadcastreceiverapplication2","com.example.mybroadcastreceiverapplication2.AnotherBroadcastReceiver"));
// sendOrderedBroadcast(intent2,null);
}
});
}
class DynamicReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"动态广播1:"+intent.getStringExtra("Info"), Toast.LENGTH_SHORT).show();
// abortBroadcast();
}
}
这里定义了一个内部类“DynamicReceiver“,并在在类中用”Toast“来弹出广播的信息和传递的内容
2、另外一个APP的注册广播
新建另外一个工程,在主活动中注册广播,保证注册的时候的标签一致即可,不用满足在新工程里的接收广播的类名是否一致。代码如下:
public class MainActivity extends AppCompatActivity {
private DynamicReceiver2 dynamicReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化IntentFilter对象
IntentFilter filter = new IntentFilter();
filter.addAction("BroadcastTest");
dynamicReceiver = new DynamicReceiver2();
//注册广播接收
registerReceiver(dynamicReceiver,filter);
}
class DynamicReceiver2 extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"动态广播2:"+intent.getStringExtra("Info"), Toast.LENGTH_SHORT).show();
}
}
}
上述代码中,只要保证”filter.addAction("BroadcastTest");”里添加的“BroadcastTest”名字和1中发送的Intent里面的名字一致即可
Intent intent = new Intent();
intent.setAction("BroadcastTest");
intent.putExtra("Info","动态广播信息");
sendOrderedBroadcast(intent,null);
3、截断广播消息
采用“sendOrderedBroadcast”发送的广播消息是可以被截断的,如果设置第一个APP中的广播注册优先级更高,如在1中主活动的代码中“filter.setPriority(100);”设置本地APP注册的广播优先级为100,默认第二个为0,则会第一个APP会优先接收到消息,在接收的方法里使用”abortBroadcast();“方法即可截断消息,代码如下:
class DynamicReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"动态广播1:"+intent.getStringExtra("Info"), Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
三、总结
1、动态注册的广播可以采用这种优先权重来觉得接收消息的顺序,并采用消息截断,静态注册的广播方法里做不到截断消息这点(可能还需要再研究一下)
2、动态注册只要保证和发送的标签一致即可,不用保证接收的类名一致