当前位置:   article > 正文

Android学习心得——跨APP广播消息_夸app广播

夸app广播

一、前言

     跨APP广播消息,顾名思义就是要在两个APP中传递消息。本文主要介绍动态注册广播消息,需要实现静态跨APP广播消息的请查看我的这篇文章跨APP静态广播。效果如图所示

二、实现

1、动态注册和发送广播

新建一个工程,在默认的活动中动态注册和发送广播

  1. public class MainActivity extends AppCompatActivity {
  2. private DynamicReceiver dynamicReceiver;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. //实例化IntentFilter对象
  8. IntentFilter filter = new IntentFilter();
  9. filter.addAction("BroadcastTest");
  10. filter.setPriority(100);
  11. dynamicReceiver = new DynamicReceiver();
  12. //注册广播接收
  13. registerReceiver(dynamicReceiver,filter);
  14. Button button=findViewById(R.id.button);
  15. button.setOnClickListener(new View.OnClickListener() {
  16. @Override
  17. public void onClick(View v) {
  18. Intent intent = new Intent();
  19. intent.setAction("BroadcastTest");
  20. intent.putExtra("Info","动态广播信息");
  21. sendOrderedBroadcast(intent,null);
  22. // Intent intent = new Intent("com.example.boradcasttestapplication.MyBroadcastReceiver");
  23. // intent.setComponent(new ComponentName("com.example.boradcasttestapplication", "com.example.boradcasttestapplication.MyBroadcastReceiver"));
  24. // sendOrderedBroadcast(intent,null);
  25. //
  26. // Intent intent2=new Intent("com.example.mybroadcastreceiverapplication2.AnotherBroadcastReceiver");
  27. // intent2.setComponent(new ComponentName("com.example.mybroadcastreceiverapplication2","com.example.mybroadcastreceiverapplication2.AnotherBroadcastReceiver"));
  28. // sendOrderedBroadcast(intent2,null);
  29. }
  30. });
  31. }
  32. class DynamicReceiver extends BroadcastReceiver
  33. {
  34. @Override
  35. public void onReceive(Context context, Intent intent) {
  36. Toast.makeText(context,"动态广播1:"+intent.getStringExtra("Info"), Toast.LENGTH_SHORT).show();
  37. // abortBroadcast();
  38. }
  39. }

这里定义了一个内部类“DynamicReceiver“,并在在类中用”Toast“来弹出广播的信息和传递的内容

2、另外一个APP的注册广播

新建另外一个工程,在主活动中注册广播,保证注册的时候的标签一致即可,不用满足在新工程里的接收广播的类名是否一致。代码如下:

  1. public class MainActivity extends AppCompatActivity {
  2. private DynamicReceiver2 dynamicReceiver;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. //实例化IntentFilter对象
  8. IntentFilter filter = new IntentFilter();
  9. filter.addAction("BroadcastTest");
  10. dynamicReceiver = new DynamicReceiver2();
  11. //注册广播接收
  12. registerReceiver(dynamicReceiver,filter);
  13. }
  14. class DynamicReceiver2 extends BroadcastReceiver
  15. {
  16. @Override
  17. public void onReceive(Context context, Intent intent) {
  18. Toast.makeText(context,"动态广播2:"+intent.getStringExtra("Info"), Toast.LENGTH_SHORT).show();
  19. }
  20. }
  21. }

上述代码中,只要保证”filter.addAction("BroadcastTest");”里添加的“BroadcastTest”名字和1中发送的Intent里面的名字一致即可

  1. Intent intent = new Intent();
  2. intent.setAction("BroadcastTest");
  3. intent.putExtra("Info","动态广播信息");
  4. sendOrderedBroadcast(intent,null);

 

3、截断广播消息

采用“sendOrderedBroadcast”发送的广播消息是可以被截断的,如果设置第一个APP中的广播注册优先级更高,如在1中主活动的代码中“filter.setPriority(100);”设置本地APP注册的广播优先级为100,默认第二个为0,则会第一个APP会优先接收到消息,在接收的方法里使用”abortBroadcast();“方法即可截断消息,代码如下:

  1. class DynamicReceiver extends BroadcastReceiver
  2. {
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. Toast.makeText(context,"动态广播1:"+intent.getStringExtra("Info"), Toast.LENGTH_SHORT).show();
  6. abortBroadcast();
  7. }
  8. }

三、总结

1、动态注册的广播可以采用这种优先权重来觉得接收消息的顺序,并采用消息截断,静态注册的广播方法里做不到截断消息这点(可能还需要再研究一下)

2、动态注册只要保证和发送的标签一致即可,不用保证接收的类名一致

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/122652
推荐阅读
相关标签
  

闽ICP备14008679号