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