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

一、前言

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

Android学习心得——跨APP广播消息_第1张图片

二、实现

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、动态注册只要保证和发送的标签一致即可,不用保证接收的类名一致

 

 

你可能感兴趣的:(Java,Android,Studio,Android)