android廣播機制(二)

    上篇已經介紹過了廣播的基本內容,這裏介紹自定義廣播。

發送標準廣播

首先我們需要新建一個廣播接收者:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        String  s = intent.getStringExtra("key");
        Toast.makeText(context, "receive in MyBroadcastReceiver:" + s, Toast.LENGTH_SHORT).show();
    }
}

修改清單文件:

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.mybroadcastreceiver2.MyBroadcastReceiver.MyBroadcastReceiver"/>
    </intent-filter>
</receiver>

啓動的時候是用到的action

發送廣播:

intent = new Intent("com.example.mybroadcastreceiver2.MyBroadcastReceiver.MyBroadcastReceiver");//  <action android:name="com.example.broadcastreceiver.BootCompleteReceiver.MyBroadcastReceiver"/>
count = count + 1;
intent.putExtra("key", count + "");
sendBroadcast(intent);

以上是APP內部的廣播,還可以不同app之間的廣播傳遞。如下圖

在此基礎上還需要再建一個project

同樣新建一個廣播接收端:

public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context,"received in AnotherBroadcastReceiver1",Toast.LENGTH_SHORT).show();
    }
}

清單文件:

<receiver
    android:name=".AnotherBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.mybroadcastreceiver2.MyBroadcastReceiver.MyBroadcastReceiver"/>
    </intent-filter>
</receiver>

發送有序廣播

以上兩個還是標準廣播,如果變爲有序廣播需要吧sendBroadcast(intent);修改爲sendOrderedBroadcast(intent,null);可以通過優先級來控制誰先收到消息。:

 

爲了方便查看重新創建一個廣播接收者:

public class MyBroadcastReceiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        String  s = intent.getStringExtra("key");
        Toast.makeText(context, "receive in MyBroadcastReceiver1:" + s, Toast.LENGTH_SHORT).show();
    }
}

清單文件:

<receiver
    android:name=".MyBroadcastReceiver1"
    android:enabled="true"
    android:exported="true">
    <intent-filter
        android:priority="1">
        <action android:name="com.example.mybroadcastreceiver2.MyBroadcastReceiver.MyBroadcastReceiver1"/>
    </intent-filter>
</receiver>

發送廣播:

Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        intent = new Intent("com.example.mybroadcastreceiver2.MyBroadcastReceiver.MyBroadcastReceiver1");//  <action android:name="com.example.broadcastreceiver.BootCompleteReceiver.MyBroadcastReceiver"/>
        count = count + 1;
        intent.putExtra("key", count + "");
        sendOrderedBroadcast(intent, null);
    }
});

另一個project:的廣播接收

public class AnotherBroadcastReceiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "received in AnotherBroadcastReceiver2", Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}

對應的清單文件:

<receiver
    android:name=".AnotherBroadcastReceiver1"
    android:enabled="true"
    android:exported="true">
    <intent-filter
        android:priority="2">
        <action android:name="com.example.mybroadcastreceiver2.MyBroadcastReceiver.MyBroadcastReceiver1"/>
    </intent-filter>
</receiver>

通過 android:priority=""來判斷優先級範圍是-1000到1000整形的值越大優先級越高。

轉發表明出處https://blog.csdn.net/qq_35698774/article/details/106573979

點擊下載源碼

android互助羣:

感謝:郭霖的《第一行代碼 第二版》

 

 

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