赞
踩
一、前言
跨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、动态注册只要保证和发送的标签一致即可,不用保证接收的类名一致
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。