BroadCastReceiver廣播接收者

介紹廣播接收者

其實BroadcastReceiver就是應用程序間的全局大喇叭,即通信的一個手段, 系統自己在很多時候都會發送廣播,比如電量低或者充足,剛啓動完,插入耳機,輸入法改變等,系統都會發送廣播,這個叫系統廣播,每個APP都會收到,如果你想讓你的應用在接收到 這個廣播的時候做一些操作,這個時候你只需要爲你的應用 註冊一個用於監視開機的BroadcastReceiver, 當然我們也可以自己發廣播,比如:接到服務端推送信息,用戶在別處登錄,然後應該強制用戶下線回到 登陸界面,並提示在別處登錄當然,這些等下都會寫一個簡單的示例幫大家瞭解廣播給我們帶來的好處

在這裏插入圖片描述

廣播接收者生命週期

靜態註冊和動態註冊的區別:假如說Activity是接受者:
動態註冊:
(1)廣播接收者會跟Activity的生命週期的結束而結束;
(2)自由的控制註冊和取消,有很大的靈活性
靜態註冊:
(1)廣播接收者不會跟隨Activity的生命週期的結束而結束,一直存在,即使應用程序關閉,也會被喚醒接受廣播
(2)全局的廣播

實現廣播接收者

首先需要創建一個java類,它繼承自廣播接收者BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

然後需要註冊一個廣播接收者

靜態註冊

在清單文件中註冊就是靜態註冊

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.highday12">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver
            android:name=".MyReceiver4"
            android:enabled="true"
            android:exported="true"></receiver>
        <receiver
            android:name=".MyLocalReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.local" />
            </intent-filter>
        </receiver>

        <activity android:name=".LocalActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyNotifyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.notify" />
            </intent-filter>
        </receiver>

        <activity android:name=".Main2Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyReceiver3"
            android:enabled="true"
            android:exported="true" />
        <receiver
            android:name=".MyReceiver2"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="FM101.3" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="FM101.1" />
                <action android:name="FM101.2" />
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
動態註冊

通過java代碼實現註冊

//動態註冊廣播接收者
//創建一個廣播
MyReceiver myReceiver = new MyReceiver();
//添加廣播過濾器
IntentFilter intentFilter = new IntentFilter();
//添加action
intentFilter.addAction("FM101.1");
intentFilter.addAction("FM101.2");
//註冊廣播
registerReceiver(myReceiver,intentFilter);

動態註冊還需要註銷廣播

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
}

發送廣播

無序廣播

Intent intent = new Intent();
intent.setAction("FM101.1");

Bundle bundle = new Bundle();
bundle.putString("name","吉吉國王");

sendBroadcast(intent);

有序廣播

區別在於方法不同:sendOrderedBroadcast()發送的是有序廣播可以被攔截

Intent intent = new Intent();
intent.setAction("FM101.3");
//intent 權限名
sendOrderedBroadcast(intent,null);

攔截廣播

//判斷是有序廣播
if (isOrderedBroadcast()){
    //中斷一個廣播
    abortBroadcast();
}

本地廣播

Activity代碼:

public class LocalActivity extends AppCompatActivity {
    private Button btnLocal;
    private ImageView ivPic;

    private LocalBroadcastManager broadcastManager;
    private MyLocalReceiver myLocalReceiver= new MyLocalReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_local);
        ivPic = (ImageView) findViewById(R.id.iv_pic);
        btnLocal = (Button) findViewById(R.id.btn_local);

        final IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.local");

        broadcastManager = LocalBroadcastManager.getInstance(this);
        //註冊
        broadcastManager.registerReceiver(myLocalReceiver,intentFilter);


        btnLocal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("com.local");
                broadcastManager.sendBroadcast(intent);
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        broadcastManager.unregisterReceiver(myLocalReceiver);
    }
}
/**
 * 本地廣播
 */
public class MyLocalReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("---", "onReceive: 本地廣播");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章