Android學習心得——跨APP廣播消息

一、前言

     跨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、動態註冊只要保證和發送的標籤一致即可,不用保證接收的類名一致

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章